emberjs追加有效,但引发断言失败错误

emberjs append works but raises Assertion Failed error

本文关键字:断言 失败 错误 追加 有效 emberjs      更新时间:2024-06-11

我是ember的新手,我正试图将一个模板附加到另一个模板上,它似乎可以工作,但它引发了一个错误,你能解释一下为什么吗?

错误:

Assertion failed: You cannot append to an existing Ember.View. Consider using Ember.ContainerView instead

这是app.js中的代码

App.NewStickie = Ember.View.extend({
  click: function(evt){
    var stickie = Ember.View.create({
        templateName: 'stickie',
        content: 'write your notes here'
    });
    stickie.appendTo('#stickies');
  }
});

这些是index.html的内容

<script type="text/x-handlebars">
    {{#view App.NewStickie}}
      <button type="button" class="btn btn-success">
        New
      </button>
    {{/view}}
    {{outlet}}
  </script>
  <script type="text/x-handlebars" id="index">
    <div id="stickies">
      {{#each item in model}}
        <div class="stickie" contenteditable="true">
          {{#view App.DeleteStickie}}
            <span class="glyphicon glyphicon-trash"></span>
          {{/view}}
          <div contenteditable="true">
            {{item.content}}
          </div>
        </div>
      {{/each}}
    </div>
  </script>
  <script type="text/x-handlebars" data-template-name="stickie">
    <div class="stickie">
      {{#view App.DeleteStickie}}
        <span class="glyphicon glyphicon-trash"></span>
      {{/view}}
      <div contenteditable="true">
        {{view.content}}
      </div>
    </div>
  </script>

ember中的每个视图都有一个模板,例如:

foo_view.js

App.FooView = Ember.View.extend({
  templateName: 'foo'
})

foo模板

<script type="text/x-handlebars" data-template-name="index">   
  <div id=myFooView>Foo</div>
</script>

您正试图以这种方式在其他视图中插入一个视图:

App.BarView.create().appendTo('#myFooView')

这是不允许的。您可以使用{{view}}手柄助手来渲染其他类似的视图:

foo模板

<script type="text/x-handlebars" data-template-name="index">   
  <div id=myFooView>
    Foo
    {{view App.BarView}}
  </div>
</script>

但我认为,你希望这是动态的工作。因此,您可以使用ContainerView,如错误消息所述:

App.StickiesView = Ember.ContainerView.extend({
  click: function() {
    var stickie = Ember.View.create({
        templateName: 'stickie',
        content: 'write your notes here'
    });
    this.pushObject(stickie);
  }
})

我在你的代码中看到了很多关于点击事件的视图,ember鼓励你使用操作,这给了你更多的灵活性,错误/加载处理等。我认为使用它是个好主意。

我希望它能帮助

您可能应该阅读本指南,其中解释了ContainerView是。此外,我认为没有必要创建另一个View来将模板附加到另一个模板。