2

我只是从 ember 开始,如果这个问题看起来很愚蠢,请原谅我。我有一个 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() 更新视图,还是每次我想更新视图时都必须复制数组?谢谢!

4

2 回答 2

0

所以我想通了这个问题。在控制器的初始化函数中,我只是像这样向内容数组添加元素

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:[] 行意味着我以后不需要再次设置内容,但似乎在初始化数组时你必须再次设置它。

于 2013-05-20T16:38:48.977 回答
0

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

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

于 2013-12-03T12:17:34.927 回答