我有一个像这样的骨干模型
define([
'underscore',
'backbone'
],function( _,Backbone) {
var Task = Backbone.Model.extend({
//api url
url:'',
methodToURL: {
'read': './api/tasks/index',
'create': './api/tasks/task',
'update': './api/tasks/task',
'delete': './api/tasks/task'
},
sync: function(method, model, options) {
options = options || {};
options.url = this.methodToURL[method.toLowerCase()];
Backbone.sync(method, model, options);
}
});
return Task;
});
和一个集合
define(['underscore','backbone','models/task'],function( _,Backbone,Task) {
var TaskCollection = Backbone.Collection.extend({
//Model
model:Task,
//api url
url:'',
methodToURL: {
'read': './api/tasks/index',
'create': './api/tasks/task',
'update': './api/tasks/task',
'delete': './api/tasks/task'
},
sync: function(method, model, options) {
options = options || {};
options.url = this.methodToURL[method.toLowerCase()];
Backbone.sync(method, model, options);
},
//construct
initialize: function() {
this.sort_key = 'end';
this._model = new Task();
this.fetch();
},
comparator: function(a,b) {
a = a.get(this.sort_key);
b = b.get(this.sort_key);
return a > b ? 1
: a < b ? -1
: 0;
},
mark_complete: function(task_id) {
var task_status = 0;
console.log(this.model);
this.model.save({id:task_id,task_status:task_status});
},
mark_incomplete: function(task_id) {
var task_status = 1;
console.log(this.model);
this.model.save({id:task_id,task_status:task_status});
},
sort_by_status: function() {
this.sort_key = 'task_status';
this.sort();
},
sort_by_task_tag: function() {
this.sort_key = 'task_group';
this.sort();
}
});
return TaskCollection;
});
当我运行mark_complete方法时,模型会记录到控制台,但会记录下来
“function (){ parent.apply(this, arguments); }
”并说“function (){ parent.apply(this, arguments); } has no method 'save'
”;
我猜测模型应该被实例化,所以集合可以访问它的方法,所以有什么不对?
答案 0 :(得分:2)
model
属性只是Collection
在向集合中添加模型时使用的构造函数。当您尝试将数据输入集合时,它旨在使您的生活更轻松。在向Task
添加TaskCollection
模型时,您不必总是调用构造函数,而只是输入一个JavaScript对象,它将执行相同的操作。
因此,如果您希望插入模型而将model
属性设置为TaskCollection
taskCollection.add(new Task({
name: "Get Milk",
description: "We're out of milk. There's a sale going on at the local supermarket."
}));
// If you wanted to just input just the JSON object without calling the
// constructor, then you can't.
如果 设置model
属性
taskCollection.add({
name: "Get Milk",
description: "We're out of milk. There's a sale going on at the local supermarket."
});
如您所见,您无需调用Task
构造函数; TaskCollection
的实例会为您调用它。
这就是为什么TaskCollection
的实例只将model
属性设置为Task
的实际构造函数,而不是初始化版本。