未捕获的错误:childViews是不可变的

时间:2015-01-17 18:18:58

标签: javascript ember.js

这是显示问题的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>

1 个答案:

答案 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/

更多信息:

您提供的链接确实表明childViewsContainerView可写,并显示了向childViews添加视图的示例。看起来这已被弃用,支持1.0中的当前方法,该页面上的信息刚刚过时。

例如,

This page说:

  

不推荐使用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");
};

但似乎已经删除了它,它现在只是抛出你看到的错误。