在我的 Ember 应用程序中,我有一个 ArrayController,可以在其中添加和删除存储中的记录。在尝试将记录创建后添加到我的 ArrayController 中时,以下三个语句似乎执行相同的操作。
App.MyItemController = Ember.ArrayController.extend({
...
var newItem = this.store.createRecord('item', {...});
// do these lines do the same thing?
this.pushObject(newItem);
});
这些调用与上面的调用同义吗?这些似乎都工作相同,并将其明显添加到模板中,并将在删除项目的操作时删除。或者说,有什么区别?
this.get('model').pushObject(newItem);
this.get('content').pushObject(newItem);
这是本着增进相互理解的精神提出的问题。谢谢您的回答!
最佳答案
它们的工作原理相同,但并非必须如此。解释一下:
ArrayController
是 ArrayProxy
和 ControllerMixin
的组合。所以...
您使用的第一种方法
this.pushObject()
来自ArrayProxy
。它的行为就像一个数组,所有数组方法也是如此。在后台,此调用确实修改content
属性,但这是一个实现细节。这让我想到...this.get('content').pushObject()
是实现细节。ArrayProxy
正在代理content
属性,但事实并非如此。 Ember 明天可能会更改它以代理proxy_content
属性。 (别担心,他们不会。)重点是您应该考虑将content
属性视为私有(private) API。this.get('model').pushObject()
可能是您想要使用的。model
来自ControllerMixin
,是公共(public) API。model
和content
在这里是相同的,但同样,它们不一定是这样。此方法可以非常明确地表明您正在修改模型。如果您更改实现,它也仍然有效。 (例如,如果您切换到ObjectController
,它仍然可以工作。)
我有点挑剔,我只是想尝试解释一下真正的差异。使用您想要的任何一种方法,但如果您像我一样是肛门并且喜欢做“正确”的事情,请使用第三种方法。
关于javascript - Ember.js:这些 .pushObject() 调用是同义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24064446/