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

In Ember how do I update a view after the ArrayController content is modified?

本文关键字:修改 新视图 更新 ArrayController Ember      更新时间:2023-09-26

我只是从ember开始,所以如果这个问题看起来很愚蠢,请原谅我。我有一个ArrayController,它保存了一个带有属性名的人的列表。我使用下面的handlebars调用为内容数组中的每个名称创建文本字段:

{{#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兼容的,这是否意味着它应该更新依赖关系和视图应该更新?我是否需要调用renderer()或其他函数来使pushObject()更新视图,或者每次我想更新视图时都必须复制数组?谢谢!

所以我弄清楚了这个问题。在控制器的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);
},   
});

我原以为第一行content:[]意味着我以后不需要再次设置content,但似乎在初始化数组时必须再次设置它。

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

后来我尝试了this.insertAt,它工作得很好,没有任何问题