如何在Ember中的所有itemController子实例上发送消息/调用方法?

时间:2014-03-10 05:05:31

标签: ember.js

我正在尝试在hasMany模型的表单中使用“Buffered Proxy”模式。完成后,我正在尝试使用“保存”按钮,触发保存操作,允许我保存所有尚未保存的更改。有关英格兰血压的更多信息:

http://coryforsyth.com/2013/06/27/ember-buffered-proxy-and-method-missing/

我可以使用顶级模型属性使所有这些工作正常,但我很困惑如何告诉我所有非单例itemControllers我希望他们保存缓冲区,然后能够调用祖父母拯救整个辣酱玉米饼馅。我希望我能从父阵列控制器做这样的事情:

actions: {

    saveStuff: function() {

        // Something like this possible?
        this.get('allTheNonSingletonItemControllerChildren').send('saveThoseBuffers'); 

    }

}

儿童控制器:

saveThoseBuffers: function() {

    var grandParent = this.get('parentController').get('parentController');

    this.applyBufferedChanges();
    grandParent.saveEntireRecord(); // Not sure how this would work yet - can't use 'needs' because none of these controllers are singletons.

}

祖父母:

saveEntireRecord: function() {

    this.get('model').save().then(function() { 
        //other stuff;
    }

}

查看类似于:

{{#each stuff in childitems itemController="childController"}}

    {{input type="text" value=stuff.name}}

{{/each}}

<button {{action 'saveStuff'}}>Save</button>

文档或SO中没有任何内容揭示了对此的咒语。

更新:

根据建议,我也尝试过:

children = this.get('content');

children.forEach(function(child) {

    child.send('saveThoseBuffers');

});

但收到了:

“未捕获错误:在状态root.loaded.saved中尝试处理事件saveThoseBuffers。”

更新2:

版本:

DEBUG: Ember      : 1.5.0-beta.2 ember.js:3496
DEBUG: Ember Data : 1.0.0-beta.7+canary.b45e23ba ember.js:3496
DEBUG: Handlebars : 1.3.0 ember.js:3496
DEBUG: jQuery     : 1.9.1 ember.js:3496

更新3:

尝试使用以下方式访问子控制器:

var children = this.get('_subControllers');

总是返回一个空数组,无论itemController在哪里设置(在ArrayController中或使用itemController =的每个循环中)

更新4:

我创建了一个JSFiddle,它使用_subControllers显示我正在尝试的内容:

http://jsfiddle.net/spA9Q/5/

然而,它只能通过使用setupController在路径中进行一些设置来工作,我没有看到我在我的应用程序中如何使用(有问题的控制器不能与模型命名相同,因为它是一个'使用{{render}}查看/编辑该模型的模式,它使用异步 有很多关系。)

1 个答案:

答案 0 :(得分:0)

上述方法都不起作用(希望Buffered Proxy会很快充实并且很快就会正式支持/集成到Ember中,因为在按下按钮之前不保存嵌套模型是一个常见的用例)所以我结束了以下内容完成工作的父控制器:

childModels = this.get('child.content.content');

childModels.forEach(function(child) {

    child.rollback(); // or .save()

});