gpt4 book ai didi

javascript - 主干模型未在集合中实例化

转载 作者:行者123 更新时间:2023-12-02 19:30:09 25 4
gpt4 key购买 nike

我有一个像这样的 Backbone 模型

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);}没有方法'save'”;我猜测模型应该被实例化,以便集合可以访问它的方法,那么出了什么问题?

最佳答案

model 属性只是 Collection 在向集合添加模型时使用的构造函数。当您尝试将数据输入到集合中时,它的目的是让您的生活更轻松。将 Task 模型添加到 TaskCollection 时,您不必总是调用构造函数,只需输入一个 JavaScript 对象,它就会执行相同的操作。

因此,当您想要插入模型而无需将 model 属性设置为 TaskCollection< 时,您的代码将如下所示/p>

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 的实际构造函数,而不是初始化版本。

关于javascript - 主干模型未在集合中实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com