骨干模型没有在集合中实例化

时间:2012-07-21 12:55:25

标签: javascript backbone.js

我有一个像这样的骨干模型

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'”; 我猜测模型应该被实例化,所以集合可以访问它的方法,所以有什么不对?

1 个答案:

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