EmberJS动作 - 在`actions`中包装时如何从一个动作调用另一个动作

51
如何在EmberJS控制器中使用actions包装一个动作并从另一个动作中调用它?
使用已弃用的定义动作的原始代码:
//app.js
App.IndexController = Ember.ArrayController.extend({
    // properties
    /* ... */

    // actions
    actionFoo: function() {
        /* ... */
        this.actionBar();
    },
    actionBar: function() {
        /* ... */
    }
});

//app.html
<div class="foo" {{action actionFoo this}}>
<div class="bar" {{action actionBar this}}>

然而,使用EmberJS 1.0.0时,我们会收到一个废弃警告,提示动作必须放在控制器内的actions对象中,而不是直接放在控制器中,如上所示。

根据建议更新代码:

//app.js
App.IndexController = Ember.ArrayController.extend({
    // properties
    /* ... */

    // actions
    actions: {
        actionFoo: function() {
            /* ... */
            this.actionBar(); //this.actionBar is undefined
            // this.actions.actionBar(); //this.actions is undefined
        },
        actionBar: function() {
            /* ... */
        }
    }
});

//app.html
<div class="foo" {{action actionFoo this}}>
<div class="bar" {{action actionBar this}}>

然而,我发现在actions中定义的一个函数无法调用另一个函数,因为this对象似乎不再是控制器。

我该如何解决这个问题?

1个回答

111
你可以使用 send(actionName, arguments) 方法。
App.IndexController = Ember.ArrayController.extend({
    actions: {
        actionFoo: function() {
            alert('foo');
            this.send('actionBar');
        },
        actionBar: function() {
            alert('bar');
        }
    }
});

这是一个带有示例的 jsfiddle http://jsfiddle.net/marciojunior/pxz4y/


我也在遵循一个过时的Ember.js教程,该教程使用了一种旧的从ArrayController调用方法的方式。经过数小时的搜索,我找到了这个答案,它可能为我节省了更多的时间。谢谢! - TheBrockEllis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接