在Ember中,如何在修改ArrayController内容后更新视图?

时间:2013-05-20 03:37:32

标签: javascript ember.js handlebars.js

我刚开始使用余烬,如果这个问题看起来很糟糕,请原谅我。我有一个ArrayController,它包含具有属性名称的人员列表。我正在使用以下手柄调用为内容数组中的每个名称创建文本字段:

{{#each App.Controller}}
{{view Em.TextField placeholder="Name" valueBinding="name" }}
{{/each}}

这是按预期工作的。我首先使用多个名称初始化我的内容数组,并为每个条目显示一个文本字段。但是,当我使用pushObject将人员添加到内容数组时,不会添加新的文本字段!使用控制台我可以看到人们被添加到内容中,视图根本不会改变。更奇怪的是,如果我按以下方式添加人员,一切都按预期工作:

this.pushObject(newPerson);
var copy = this.get('content');
this.set('content',[]);
this.set('content',copy); 

当我以这种方式添加人物时,我会为新添加的人获得另一个文本字段。 ember文档说pushObject()符合KVO,这是否意味着它应该更新依赖项并且视图应该更新?我是否需要调用rerender()或其他函数来使pushObject()更新视图,或者每次要更新视图时是否必须复制数组?谢谢!

2 个答案:

答案 0 :(得分:0)

所以我想出了这个问题。在我的Controller的init函数中,我只是像这样添加元素到内容数组

App.Controller = Em.ArrayController.create({
content: [],

init: function(){
    this.insertNew();
},


insertNew: function(){
    var t = App.Person.create({
        name:"test"
    });
    this.pushObject(t);
},   

});

调用insertNew时,此代码未更改视图(尽管初始化有效)。通过将this.set(“content”,[])添加到我的init函数中,insertNew的行为符合预期。这是工作代码:

App.Controller = Em.ArrayController.create({
content: [],

init: function(){
    this.set("content",[]);
    this.insertNew();
},


insertNew: function(){
    var t = App.Person.create({
        name:"test"
    });
    this.pushObject(t);
},   

});

我曾想过第一个内容:[]行意味着我以后不需要再次设置内容,但似乎在初始化数组时你必须再次设置它。

答案 1 :(得分:0)

我遇到类似的问题,当我使用this.pushObject添加新项目时,只有在项目是第一个对象时,视图才会更新。

后来我尝试使用this.insertAt,它运行良好,没有任何问题。