在Ember中,我如何在ArrayController的内容被修改后更新视图
In Ember how do I update a view after the ArrayController content is modified?
我只是从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
,它工作得很好,没有任何问题
- $routeParams在传递到新视图时未定义&控制器
- 如何使用 javascript 修改网格视图单元格值
- 如何在渲染新视图之前关闭所有事件
- 从Backbone中的另一个视图调用新视图
- Angular2 在创建 ngSwitch 新视图后调用自定义函数
- Chrome扩展程序修改新标签页正文
- 主干新视图反映旧模型数据
- 创建新视图时调用呈现函数
- 离子替换新视图的选项卡和页脚
- YII:如何将参数列表从js传递到控制器,并通过传递另一个列表来调用新视图
- AngularJS-关闭tile并从ngRepeat指令AngularJS中的模型加载新视图
- Window.打开并修改新窗口的DOM
- 美元AngularJs http.post不渲染新视图
- Angular UI Router新视图,相同的URL
- AngularJS:在Promise被解析后,为新视图操作DOM
- 如何用JS修改新元素的子元素,当不在页面中时
- 骨干移除和新视图不会重置其属性数组内容
- 尝试将数据加载到新视图中
- 将js变量传递给控制器并在ci中构建新视图
- 在类似视图上使用class而不是id创建新视图