我正在尝试检测组件中创建的事件。什么也没发生。
can.Component.extend({
// todos-list component
// lists todos
tag: "todos-list",
template: can.view("javascript_view/todos-list"),
scope: {
Todo: Todo,
todos: TodoList.slice(0),
todoCreated: function(context, element) {
// new todo is created
var Todo = this.Todo;
new Todo({
name: can.trim(element.val())
}).save();
element.val("");
}
},
events: {
"{Todo} created": function(Todo, event, newTodo) {
console.log("created");
}
}
});
型号为
var Todo = can.Model.extend({
// todo model
// fetches things and so on
findAll: function() {
// get all todos
return $.Deferred().resolve(todos);
},
findOne: function(params) {
// get one todo
return $.Deferred().resolve(todos[(+params.id) - 1]);
},
create: function(attributes) {
// creates new todo
var last = todos[todos.length - 1];
$.extend(attributes, {id: last.id + 1, detail: "", tag: ""});
todos.push(attributes);
return $.Deferred().resolve(attributes);
},
update: function(id, attributes) {
// update one todo
$.extend(todos[id - 1], attributes);
return $.Deferred().resolve();
},
destroy: function() {
// destroy todo
return $.Deferred().resolve();
}
}, {});
标记为
<input type="text" name="todo" placeholder="What needs to be done" can-enter="todoCreated" />
这是处理已创建事件的正确方法,还是有更好的方法
当创建新的todo时,我需要列表来做出反应
请参阅此处获取代码
这是一个错误:https://github.com/bitovi/canjs/issues/1261
这是由于CanJS将Todo
构造函数视为一个方法,因为Todo
是一个JS函数。
你可以通过把Todo放在罐子上来解决这个问题。直接用作范围的映射实例如下所示:
http://jsfiddle.net/c3bfy/147/
诀窍是用你想要的范围方法创建一个单独的视图模型:
TodoListViewModel = can.Map.extend({
todoCreated: function(context, element) { ... }
});
并更改您的范围以返回此视图模型的实例,其中Todo
作为属性:
scope: function(){
return new TodoListViewModel({Todo: Todo})
},
这迫使Todo
被视为一个属性,而不是一个方法。