Backbone.js 通过每个迭代的BackboneJS集合返回默认模型,而不是精确定义的模型
我需要一些帮助。我已经在BackboneJS中定义了模型和集合Backbone.js 通过每个迭代的BackboneJS集合返回默认模型,而不是精确定义的模型,backbone.js,model-view-controller,typescript,underscore.js,underscore.js-templating,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 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';
}
在下划线JS模板中,我想像这样调用MyModel方法myMethod()
myCollection.each(function(myModel) {
myModel.myMethod();
}
但我在调用myMethod()时遇到异常
是我做错了什么,还是无法将集合中的模型强制转换为定义的类型?如果没有,为什么还要定义集合项的类型?您会遇到此错误,因为Typescript编译器认为
myModel
的类型是Backbone.Model
,就像您的代码是:
myCollection.each(function(myModel: Backbone.Model) { // Error!
myModel.myMethod();
});
它失败,因为myMethod()
在Backbone.Model
上不存在。主干类型定义在Backbone.d.ts
文件中定义
要解决此问题,您需要通过指定模型类型来帮助Typescript进行类型推断:
myCollection.each(function(myModel: MyModel) { // Works as you expect
myModel.myMethod();
});
编辑:好的,我确实在一个typescript文件中重新创建了它,所以它在那个上下文中工作
我认为解决这个问题的最佳方法是直接在原型上定义模型属性:
export class MyCollection extends Backbone.Collection {
url = 'apiURL/getmycollection';
}
MyCollection.prototype.model = MyModel;
现在,可以通过像这样的模型转换来解决这个问题myModel=newmymodel(myCollection.models[i].attributes)
。但这不是我想为每一个人做的事。你在问题上有你所需要的一切。我正确地调用了所有的东西,但有一个问题,即使在调用myCollection.get('modelCID')
时,我也得到了类Backbone.Model的实例,而不是类MyModel的实例。这不是问题,因为我在下划线JS模板中的纯javascript中执行每个over集合,因此,Typescript不会与此代码发生冲突。即使在调试代码时,我也可以看到集合类型为MyCollection
,但我得到的模型是Backbone.model
export class MyCollection extends Backbone.Collection {
url = 'apiURL/getmycollection';
}
MyCollection.prototype.model = MyModel;