【问题标题】:Understanding Ember.Evented - how to listen on events triggered in a controller from a view?了解 Ember.Evented - 如何从视图中监听控制器中触发的事件?
【发布时间】:2014-07-04 04:46:38
【问题描述】:

使用像这样使用Ember.Evented mixin 的控制器:

    var FoosController = Ember.ArrayContoller.extend(Ember.Evented, {
        /* ... */

        actions: {
            someAction: function() {
                this.trigger('someActionMessage', 'bla bla');
            },
        },
    });
    export default FoosController;

我定义了这个控制器的活动视图,以便它监听 对于someActionMessage,像这样:

    var FoosView = Ember.View.extend({
        onSomeActionMessage: function() {
            console.log('FoosView onSomeActionMessage', arguments);
        }.on('controller.someActionMessage'),
    });
    export default FoosView;

... 但是,onSomeActionMessage 方法永远不会被调用。 所以我尝试了一些其他的东西,这似乎是等价的,除了更冗长(和更混乱)。

    var FoosView = Ember.View.extend({
        onDidInsertElement: function() {
            var ctrl = this.get('controller');
            ctrl.on('someActionMessage', this, this.onSomeActionMessage);
        }.on('didInsertElement'),

        onSomeActionMessage: function() {
            console.log('FoosView onSomeActionMessage', arguments);
        },
    });
    export default FoosView;

另一方面,这按预期工作。

为什么后者有效,而前者无效; 为什么 .on() 不像 didInsertElement 那样对我的自定义事件起作用?

【问题讨论】:

    标签: javascript ember.js publish-subscribe


    【解决方案1】:

    我不相信on 支持链接。因此它无法链接到控制器及其事件。这就是为什么当您手动设置它并传入事件名称时它可以正常工作的原因。我最初是这样理解的,我需要去看代码的工作,但我很确定它是这样设计的。

    【讨论】:

    • kingpin2k 在这里链接是什么意思?后一种有效的方法是发生链接的方法,其中一个.on() 在另一个本身是.on() 的函数中注册。似乎 without 链接的变体是行不通的。我理解你的意思吗?
    • 对不起,当我说链接时,我指的是发生在 get/set/property 上的链接( this.get('foo.bar') 本质上是 this.get('foo' ).get('bar'),翻译成一串gets/sets)。因此,当您尝试设置“链式事件”时,controller.someEvent Ember 实际上并没有设置链,而是跟随控制器返回其事件。 (希望这不会更令人困惑,已经很晚了)
    猜你喜欢
    • 2021-12-30
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2015-11-22
    • 2017-01-08
    相关资源
    最近更新 更多