Knockback Collection Observable throws"无法读取属性' bind'未定义"错误

时间:2013-05-27 15:21:46

标签: javascript backbone.js knockout.js underscore.js knockback.js

我正在尝试创建一个简单的viewmodel来显示具有Knockback的对象列表。 View Model非常简单,如下所示:

var objectives_collection = new ObjectiveCollection();
objectives_collection.fetch();

var view_model = kb.ViewModel.extend({
    objectives: kb.CollectionObservable(objectives_collection),
    constructor: function() {
        _this = this;
        kb.ViewModel.prototype.constructor.call(this, model = new Objective(), {});
        console.log(this.objectives);
        return this;
    },
    addObjective : function() {
        var objective_model = new Objective({name: "New Objective", descriptor: 'Add description here'});
        this.objectives.add(objective_model);
        objective_model.save();
        console.log(objectives);
    },
    edit: function() {
        console.log('Edit');
    },
    remove: function(objective) {
        self.objectives.remove(objective);
    }

});

现在,视图模型的第一行(kb.CollectionObservable(goals_collection))给了我悲伤。它正在调用Underscore.js的绑定函数并尝试设置onCollectionChange侦听器,但是这里的Knockback行尝试绑定未定义的函数:

this.__kb._onCollectionChange = _.bind(this._onCollectionChange, this);

其中this._onCollectionChange显然未定义。我不确定该怎么做;我在这做错了什么?

1 个答案:

答案 0 :(得分:1)

Knockback.js中有两个用于创建CollectionObservable的函数。

一个函数是名为 kb.CollectionObservable 的构造函数,另一个函数是名为 kb.collectionObservable 的工厂方法。注意区分大小写的区别?

使用构造函数时,将其称为:

var myCollection = new kb.CollectionObservable(...);

使用工厂,您正在调用一个为您使用new关键字的方法。所以你要输入:

var myCollection = kb.collectionObservable(...);

希望能够解决它。