我正在通过Ryan LaBouve's YouTube tutorial使用Ember CLI构建TodoMVC应用程序。我已经走了一半,现在在模板中添加一个条件。当双击(待办事项列表)项目时,它应该触发一个函数 editTodo ,它将属性“isEditing”设置为 true ,并用输入替换文本框。
doubleClick功能根本不起作用。它在控制台中抛出以下错误:
未捕获错误:没有处理动作'editTodo'。如果您确实处理了该操作,则可以通过从控制器中的操作处理程序返回true来导致此错误,从而导致操作冒泡。
这是相关的模板部分( todos.hbs ):
<section id="main">
<ul id="todo-list">
{{#each todo in model itemComtroller="todo"}}
<li {{bind-attr class="todo.isCompleted:completed todo.isEditing:editing"}}>
{{#if todo.isEditing}}
<input class="edit">
{{else}}
{{input type="checkbox" class="toggle" checked=todo.isCompleted}}
<label {{action "editTodo" on="doubleClick"}}>{{todo.title}}</label><button class="destroy"></button>
{{/if}}
</li>
{{/each}}
</ul>
<input type="checkbox" id="toggle-all">
</section>
以下是具有“editTodo”功能的控制器( todo.js ):
import Ember from 'ember';
export default Ember.ObjectController.extend({
actions: {
editTodo: function() {
this.set('isEditing', true);
}
},
isEditing: false,
isCompleted: function(key, value) {
var model = this.get('model');
if (value === undefined ) {
return model.get('isCompleted');
} else {
model.set('isCompleted', value);
model.save();
return value;
}
}.property('model.isCompleted')
});
我已经使用视频和相关的Github repo交叉引用了我的代码,但仍无法找到问题的原因。关于SO还有相关的问题,但我没有看到这样的问题。显然我是Ember.js的新手,可以使用我能得到的所有帮助。
谢谢!
答案 0 :(得分:1)
您似乎遇到了Ember 1.13.4中引入的错误。我不确定它是什么,但它与使用项目控制器并在循环中执行操作有关。目前,您可以降级到Ember 1.13.3或更低以解决问题。我将提交一份错误报告,以便在以后的Ember版本中修复。
从长远来看,你不会写这样的代码。项目控制器已在Ember 2.0中完全删除,因此在使用Ember 2.0时,您可能会切换到使用此类情况的组件。现在你可以练习使用Ember 1.13.3。
几乎忘了:
EDIT2:似乎在Ember(可能是另一个错误?)之间的某些行为已经在1.12.0和1.13.0之间发生了变化。由于某种原因,操作不再被捕获在项目控制器中,而是直接发送到路径控制器。我并非100%确定原因,但作为修复,您可以降级为Ember 1.12或将editTodo
操作移至todos
控制器。
EDIT3:Link to second Github issue
EDIT4:正如第二个错误故障单中所建议的那样,您还可以更改操作的目标:
<label {{action "editTodo" on="doubleClick" target="todo"}}>{{todo.title}}</label>