我现在正在学习Ember,我有点困惑,因为Ember的文档和刚开始的例子。文件中说:
在Ember.js中,模板从控制器获得它们的属性,控制器可以修饰模型。
和
模板总是连接到控制器,而不是模型。
但是在做了入门指南之后,我不确定这是否正确。
我已经上传了完成的TodoMVC应用程序:https://github.com/Yannic92/stackOverflowExamples/tree/master/Ember/TodoMVC
在Index.html中,您可以找到以下模板:
<script type="text/x-handlebars" data-template-name="todos/index">
<ul id="todo-list">
{{#each todo in model itemController="todo"}}
<li {{bind-attr class="todo.isCompleted:completed todo.isEditing:editing" }}>
{{#if todo.isEditing}}
{{edit-todo class="edit" value=todo.title focus-out="acceptChanges" insert-newline="acceptChanges"}}
{{else}}
{{input type="checkbox" checked=todo.isCompleted class="toggle"}}
<label {{action "editTodo" on="doubleClick"}}>{{todo.title}}</label>
<button {{action "removeTodo"}} class="destroy"></button>
{{/if}}
</li>
{{/each}}
</ul>
</script>我的问题是第三行:
{{#each todo in model itemController="todo"}}控制器todo只需要为待办事项提供操作。即使没有此控制器,数据也是可访问的。在我看来,有一个模型与模板直接相关,不是吗?
或者有像这里提到的docu那样的默认控制器吗?
为了方便起见,Ember.js提供了从其模型中代理属性的控制器,以便您可以在模板中指定{{name}}而不是{{model.name}}。
发布于 2015-03-30 12:17:25
正如您在这一行中看到的:<script type="text/x-handlebars" data-template-name="todos/index">,这是/的模板,因为路由器有以下一行:this.route('todos', { path: '/'})。它将有一个名为TodosController的控制器,即使您没有编写一个成员,也会为您生成一个。所以当你删除它时,就会发生这样的事情。
在这个模板中,您循环遍历todo的列表。这些Todo模型中的每一个都由一个控制器TodoController来修饰。使用这一行:{{#each todo in model itemController="todo"}},您告诉成员对列表中的每个元素使用这个TodoController。
如果您省略了itemController成员,那么假设todo是IndexRoute提供的IndexController模型的一部分。
默认情况下,ember有一个空控制器,它将所有内容代理到底层模型。(注:我相信这将在成员2.0中改变)。所以它看起来像是直接耦合到模型上。但是,您可以编写一个控制器,它可以更改所有,而不需要更改模型。
https://stackoverflow.com/questions/29344511
复制相似问题