为什么在todo示例中使用Backbone和requirejs时会出现错误?

时间:2014-07-24 18:39:11

标签: javascript backbone.js requirejs

我不明白为什么会收到此错误:TypeError:当使用Backbone和Requirejs时,State.setActive不是函数。

我删除了一些代码来简化。我错过了什么?感谢。

模型


define([
    'jquery',
    'backbone',
    'underscore',

], function($, Backbone, _ ) {
    'use strict';

    var State = Backbone.Model.extend({
        defaults: {
            activeTask: ''
        },

        setActive: function(model){
            State.set({activeTask : State.get('activeTask') === model.id ? '' : model.id});
        }

    });

    _.extend(State, Backbone.Events);

    return State;
});

查看



define([
    'jquery',
    'underscore',
    'backbone',
    'models/state-model',

],  function ( $, _, Backbone, State) {
        'use strict';

        var TodoView = Backbone.View.extend({

            tagName:  'li',

            template: _.template($('#todo-template').html()),


            initialize: function () {
                this.listenTo(this.model, 'change', this.render);

            },

            events: {

                "dblclick .view" : "clickActive",

            },

            render: function(){
                 this.$el.toggleClass('done', this.model.get('done'));
                 this.$el.toggleClass('active', this.model.get('active'));
                 this.toggleVisible();           
                 this.$el.html(this.template(this.model.toJSON()));
                 return this;
            },


            clickActive: function() {

                State.setActive(this.model);
                this.model.toggleActive();

            }

    });

    return TodoView;

});

2 个答案:

答案 0 :(得分:0)

State是一个构造函数,你必须实例化它。在模型中尝试这个(假设你想让它成为单身人士):

define([
    'jquery',
    'backbone',
    'underscore',

], function($, Backbone, _ ) {
    'use strict';

    var State = Backbone.Model.extend({
        defaults: {
            activeTask: ''
        },

        setActive: function(model){
           State.set({activeTask : State.get('activeTask') === model.id ? '' : model.id});
        }

    });

    _.extend(State, Backbone.Events);

    return State(); // <- change here
});

答案 1 :(得分:0)

您的问题是您没有在任何地方实例化您的状态模型。当您从州模块中return State仅返回

如果State是一个 singleton ,那么你可以在它自己的模块中实例化它并返回它。否则,最好的选择可能是在创建实例化todo视图时传入模块。

例如

var state = new State();
var todo = new TodoView ({state: state, model: myModel});

在您的TodoView视图中

var TodoView = Backbone.View.extend({

    tagName:  'li',

    template: _.template($('#todo-template').html()),


    initialize: function (options) {
        this.state = options.state;
        this.listenTo(this.model, 'change', this.render);
    },
   ...