In Aurelia, can I bind a function from my containing view-model to be called by my custom element?

后端 未结 3 1825
后悔当初
后悔当初 2021-02-08 20:00

I have a custom element which will take user input, and on [save] button click, I want to pass information to the parent view-model so I can send it to the server and move to th

3条回答
  •  余生分开走
    2021-02-08 20:42

    You have two options for this. You could handle this using Custom Events, or you can do it using the call binding that Anj mentioned in his answer. Which one you use depends on your actual use case.

    If you want the custom element to be able to call a method on your parent VM and pass data out of the custom element, then you should use a Custom Event as shown in this gist: https://gist.run/?id=ec8b3b11f4aa4232455605e2ce62872c:

    app.html:

    
    

    app.js:

    export class App {
      parentProperty = 7;
      parentMethod($event) {
        this.parentProperty = $event.detail;
      }
    }
    

    my-element.html:

    
    

    my-element.js:

    import { inject, customElement, bindable } from 'aurelia-framework';
    
    @customElement('my-element')
    @inject(Element)
    export class MyElement {
      eventDetailValue = 'Hello';
    
      constructor(element) {
        this.element = element;
      }
    
      save() {
        var event = new CustomEvent('save', { 
          detail: this.eventDetailValue,
          bubbles: true
        });
    
        this.element.dispatchEvent(event);
      }
    } 
    

    You would basically attach any data you need to pass on the detail property of the Custom Event. In the event binding declaration, you would add $event as a parameter to the function and then check the detail property of $event in your event handler (you could also just pass $event.detail if you wanted).

    If you want the custom element to be able to call a method on your parent VM and have data passed in from the parent VM (or from another custom element or something), then you should use the call binding. You can specify arguments that will be passed to the method by specifying them in the binding declaration (foo.call="myMethod(myProperty)". These arguments come from the VM context where the binding is being declared, not from the Custom Element's VM).

提交回复
热议问题