【发布时间】:2013-03-20 19:50:17
【问题描述】:
我有以下代码
Todos = Ember.Application.create();
Todos.Todo = Ember.Object.extend({
title: null,
isDone: false
});
Todos.TodosController = Ember.Object.extend({
// We need an array to hold our Todo objects
todos: Ember.A(),
init: function(){
debugger;
var items = this.get('todos');
items.addObject(Todos.Todo.create({title: "This is an Ember Item"}));
items.addObject(Todos.Todo.create({title: "This is another Ember Item"}));
},
remainingCount: function(){
return this.get('todos').filterProperty('isDone', false).length;
}.property('todos.@each.isDone')
});
Todos.controller = Todos.TodosController.create();
Todos.TodoView = Ember.View.extend({
templateName: 'todos'
});
</script>
我在 thml 中定义了以下车把挂钩。但由于某种原因,模板没有被渲染。当我检查Handlebars.templates 时,我看到返回的对象中列出了待办事项。我在这里错过了什么。
编辑
是否可以在 .handlebars 文件中定义模板?
编辑
我在 app.js 中做了这个。
$.extend(Ember.TEMPLATES, Ember.TEMPLATES, Ember.Handlebars.templates);
但这似乎也没有帮助。如下图所示,模板现在列在Ember.TEMPLATES 中。但由于某种原因,它没有接他们。
另外,我在正文标签之间没有任何 html。我不确定那里是否应该有任何东西。
<body></body>
【问题讨论】:
-
你的待办事项模板是在哪里定义的?你是在外部定义的?你用什么编译的?
-
我在一个名为
todos.handlebars的文件中使用外部模板。我将它们编译为构建过程的一部分。因此下载了一个名为 templates-compiled.js 的文件。 -
这里发生了一些事情:您正在手动创建控制器的实例并且您没有正确使用命名约定:控制器应该是
TodosController扩展Ember.ArrayController而不是Ember.Object因此您不必定义todos属性,只需使用content代替。这也带来了控制器中的其他几个功能。另请注意,在 Ember 中使用 Handlebars 与其他框架略有不同。您应该通过Ember.Handlebars.compile('your template')将您编译的模板存储在Ember.TEMPLATES集合中 -
您确定在您的应用程序开始使用模板之前已在客户端中加载了预编译的模板文件?你应该有一个名为
application的模板,这是你的布局。 -
正如我之前所说,您需要一个名为
application的模板。您将按照应用程序的正确路径加载TodosView调用{{view}}助手或{{outlet}}助手,但需要有一个application模板。我强烈建议您阅读guides。