这是显示问题的jsbin,但是,它不会像我的计算机上那样识别错误。在我的电脑上,我被告知Uncaught Error: childViews is immutable
。
我试图在点击事件中向containerView
添加子视图,但我被告知childviews(containerView上的一组视图)是不可变的。你能解释一下如何将childView添加到containerView吗?我也试过appendChild
,但是有一条错误消息,说明在渲染过程中无法调用它。
在旧版本的Ember中,您曾经能够将对象推送到childViews数组,例如,此jsfiddle显示但api似乎已更改。
如果不可能,如何在不推送到containerView上的childViews数组的情况下创建这个ui?
App = Ember.Application.create({});
App.MainView = Em.View.extend({
classNames: ['mainView']
});
App.MyContainerView = Em.ContainerView.extend({});
App.AnotherView = Em.View.extend({
render: function(buffer){
buffer.push('App.AnotherView ' + this.get('elementId'));
}
});
App.AddChildViewButton = Em.View.extend({
tagName: 'button',
render: function(buffer) {
buffer.push('Add Child View');
},
click: function() {
var containerView = Em.View.views['my_container_view']
var childView = containerView.createChildView(App.AnotherView);
containerView.get('childViews').pushObject(childView);
}
});
模板
<script type="text/x-handlebars" >
{{#view App.MainView}}
<h1>Hello world!</h1>
<br>
{{view App.AddChildViewButton}}
<br>
{{view App.MyContainerView elementId="my_container_view"}}
{{/view}}
</script>
答案 0 :(得分:0)
如documentation for Ember.ContainerView
所示,您可以通过将对象推送到视图本身而不是其childViews
属性来将子视图添加到容器视图中:
click: function() {
var containerView = Em.View.views['my_container_view']
var childView = containerView.createChildView(App.AnotherView);
// no need for .get('childViews')
containerView.pushObject(childView);
}
以下是显示此内容的文档之一(还有一个在this.pushObject(...)
方法中使用init
的示例):
var container = Ember.ContainerView.create();
container.append();
var firstView = App.FirstView.create(),
secondView = App.SecondView.create();
container.pushObject(firstView);
container.pushObject(secondView);
这是一个jsBin,你的问题中的例子按预期运行:
http://jsbin.com/ciwonuqezi/3/
更多信息:
您提供的链接确实表明childViews
中ContainerView
可写,并显示了向childViews
添加视图的示例。看起来这已被弃用,支持1.0中的当前方法,该页面上的信息刚刚过时。
不推荐使用ContainerView的childViews
这是另一项改变,将导致更少的代码。以前,如果您有ContainerView,可以使用childViews proeprty添加和删除它的视图。现在,不推荐使用childViews属性,因为ContainerView本身就像一个Array。所以而不是:
看起来at some point Ember提供了弃用通知,并允许在尝试修改ContainerView的childViews时执行操作:
ret.replace = function (idx, removedCount, addedViews) {
if (view instanceof Ember.ContainerView) {
Ember.deprecate("Manipulating an Ember.ContainerView through its childViews property is deprecated. Please use the ContainerView instance itself as an Ember.MutableArray.");
return view.replace(idx, removedCount, addedViews);
}
throw new Ember.Error("childViews is immutable");
};
但似乎已经删除了它,它现在只是抛出你看到的错误。