【问题标题】:Pass parameters with EventEmitter使用 EventEmitter 传递参数
【发布时间】:2016-05-25 06:21:49
【问题描述】:

我有一个指令来初始化一个可在 DOM 元素上排序的 jQueryUI。 jQueryUI sortable 还具有一组触发某些操作的回调事件。例如,当您对startstop 进行排序时。

我想通过emit() 函数传递来自此类事件的返回参数,这样我就可以实际看到我的回调函数中发生了什么。我只是还没有找到通过EventEmiiter 传递参数的方法。

我目前有以下。

我的指令:

@Directive({
    selector: '[sortable]'
})
export class Sortable {
    @Output() stopSort = new EventEmitter();

    constructor(el: ElementRef) {
      console.log('directive');
        var options = {
          stop: (event, ui) => {
            this.stopSort.emit(); // How to pass the params event and ui...?
          }
        };

        $(el.nativeElement).sortable(options).disableSelection();
    }
}

这是我的Component,它使用指令发出的事件:

@Component({
  selector: 'my-app',
  directives: [Sortable],
  providers: [],
  template: `
    <div>
      <h2>Event from jQueryUI to Component demo</h2>

      <ul id="sortable" sortable (stopSort)="stopSort(event, ui)">
        <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
        <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
        <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
      </ul>
    </div>
  `
})
export class App {
  constructor() {

  }

  stopSort(event, ui) { // How do I get the 'event' and 'ui' params here?
    console.log('STOP SORT!', event);
  }
}

如何在stopSort() 函数中获取eventui 参数?

这是我目前所拥有的演示:http://plnkr.co/edit/5ACcetgwWWgTsKs1kWrA?p=info

【问题讨论】:

  • 我无法弄清楚ui 应该是什么。它从何而来?如果参考应该怎么做?

标签: angular eventemitter angular2-directives


【解决方案1】:

pixelbits 的答案在最终版本中有所改变。如果您有多个参数,只需将其作为一个对象传递即可。

子组件:

this.stopSort.emit({event,ui});

@Output() stopSort= new EventEmitter<any>();

父组件:

hereIsHeight(value) {
        console.log("Height = " + value.event); 
        console.log("Title = " + value.ui); 
    }   

父组件中的HTML:

<test-child1 (stopSort)="hereIsHeight($event)"></test-child1>

-- 如果你有类似的值:(前面有“this”)

this.stopSort.emit({this.event,this.ui});

它们不起作用,您需要将它们更改为其他内容,然后通过:

let val1 = this.event;
let val2 = this.ui;
this.stopSort.emit({val1,val2});

*更新:阅读下面 Colin B 的回答,了解使用“this”传递值的方法。

【讨论】:

  • 注意:在&lt;test-child1 (stopSort)="hereIsHeight($event)"&gt;&lt;/test-child1&gt; 中你必须使用参数名称$event 否则它似乎不起作用
【解决方案2】:

我无法添加评论,只是想从 Alpha Bravo 的回答中指出,您可以通过 this.event,只是不能使用属性值速记:

this.stopSort.emit({ event : this.event, ui : this.ui });

另请注意,如果它们以 this.stopSort.emit({ val1, val2 }); 的形式通过 EventEmmiter 传递,那么它们将在父级中被访问为:

hereIsHeight(value) {
    console.log(`event = ${ value.val1 }`); 
    console.log(`ui = ${ value.val2 }`); 
}

因此在这种情况下避免使用简写可能更可取,以保持命名一致。

【讨论】:

    【解决方案3】:

    在孩子身上像这样工作:

    @Output() myEvent: EventEmitter<boolean> = new EventEmitter();
    myFunc(value: boolean) {
    this.myEvent.emit(value);
    }
    

    现在您只需要在父级中抓取事件!

    【讨论】:

      【解决方案4】:

      EventEmitter 支持一个参数,它作为$event 传递给您的事件处理程序。

      当您将参数传递给emit 时,将参数包装在一个事件对象中:

      this.stopSort.emit({ event:event, ui: ui });
      

      然后,当你处理事件时,使用$event:

      stopSort($event) { 
        alert('event param from Component: ' +$event.event);
        alert('ui param from Component: ' + $event.ui);
      }
      

      Demo Plnkr

      【讨论】:

      • 在使用 ES6 时只是一个小说明 {event: event, ui: ui} 可以简写为 {event, ui}
      • 只是一个小评论,因为我与它战斗了一个小时:你必须在你的方法中将属性命名为 $event。否则你会得到一个未定义的。
      • 有点题外话,但谁能解释一下美元($)符号?为什么它总是与 EventEmiter 参数一起使用?
      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 2017-04-21
      • 2019-04-28
      • 2019-04-04
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2012-05-24
      相关资源
      最近更新 更多