Backbone JS集合迭代到每个返回默认模型而不是精确定义的模型

时间:2014-08-14 09:05:07

标签: backbone.js model-view-controller typescript underscore.js underscore.js-templating

我需要一些帮助。我在BackboneJS中定义了模型和集合

export class MyModel extends Backbone.Model {
    constructor(options?) {
        this.urlRoot = 'apiURL/getmymodel';
        this.idAttribute = 'ID';
        super(options);
    }

    myMethod(): any {
        ...
    }
}

export class MyCollection extends Backbone.Collection {
    model = MyModel;
    url = 'apiURL/getmycollection';
}

在UnderscoreJS模板中,我想像这样调用MyModel方法myMethod()

myCollection.each(function(myModel) {
    myModel.myMethod();
}

但是我在调​​用myMethod()

时遇到异常
TypeError: undefined is not a function
我正在做某事。错误或者每个都不可能将集合中的模型转换为定义的类型?如果没有,为什么甚至定义了集合项的类型?

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为Typescript编译器认为myModel的类型为Backbone.Model,就像您的代码是:

myCollection.each(function(myModel: Backbone.Model) {  // Error!
    myModel.myMethod();
});

myMethod()上不存在Backbone.Model失败的内容。骨干类型定义在Backbone.d.ts文件中定义。

要解决您的问题,您需要通过指定模型类型来帮助Typecript进行类型推断:

myCollection.each(function(myModel: MyModel) {  // Works as you expect
    myModel.myMethod();
});

编辑:好的,我确实在一个打字稿文件中重新创建了它,所以它在那个环境中工作。

我认为解决此问题的最佳方法是直接在model上定义prototype属性:

export class MyCollection extends Backbone.Collection {
    url = 'apiURL/getmycollection';
}
MyCollection.prototype.model = MyModel;