淘汰JS模型继承
Knockout JS Model Inheritance
我的应用程序中有三个相对相似的淘汰模型,我想扩展一个基本模型来组合公共属性,而不是重复三次。
示例
var ItemModel = function (item) {
var self = this;
self.order = ko.observable(item.order);
self.title = ko.observable(item.title);
self.price = ko.observable(item.price);
self.type = ko.observable(item.type);
};
var StandardItemModel = function (item, cartItemTypes) {
var self = this;
self.order = ko.observable(item.order);
self.title = ko.observable(item.title);
self.price = ko.observable(item.price);
self.type = ko.observable(item.type);
self.isInCart = ko.computed(function () {
return cartItemTypes().indexOf(item.type) > -1;
}, self);
self.itemClass = ko.computed(function () {
return self.isInCart() ? "icon-check" : "icon-check-empty";
}, self);
};
var CustomItemModel = function (item) {
var self = this;
self.order = ko.observable(item.order);
self.title = ko.observable(item.title);
self.price = ko.observable(item.price);
self.type = ko.observable(item.type);
self.icon = item.icon;
};
我想使用ItemModel作为基类,并根据需要添加额外的属性。
我认为你可以像这个一样使用ko.utils.extend
ko.utils.extend(self, new ItemModel(item));
在StandardItemModel 内部
像这样:http://jsfiddle.net/marceloandrader/bhEQ6/
我想你可以这样做:
var StandardItemModel = function (item, cartItemTypes) {
var self = this;
self.standard = new ItemModel(item);
self.isInCart = ko.computed(function () {
return cartItemTypes().indexOf(item.type) > -1;
}, self);
self.itemClass = ko.computed(function () {
return self.isInCart() ? "icon-check" : "icon-check-empty";
}, self);
}
您可以使用.call或.apply链接构造函数调用
function ItemModel (item) {
var self = this;
self.order = ko.observable(item.order);
self.title = ko.observable(item.title);
self.price = ko.observable(item.price);
self.type = ko.observable(item.type);
}
function StandardItemModel(item, cartItemTypes) {
var self = this;
ItemModel.call(this, item);
self.isInCart = ko.computed(function () {
return cartItemTypes().indexOf(item.type) > -1;
}, self);
self.itemClass = ko.computed(function () {
return self.isInCart() ? "icon-check" : "icon-check-empty";
}, self);
}
function CustomItemModel (item) {
var self = this;
ItemModel.apply(this, [item]);
self.icon = item.icon;
}
与ko.utils.extend
(或jQuery、underline等中的类似方法)相比,优势在于您创建的附加对象不只是为了获取对其方法的引用。
function MyBaseType() {
var self = this;
self.Id = 1
}
function MyComplexType() {
var self = this;
//Extending this class from MyBaseType
ko.utils.extend(self, new MyBaseType());
self.Name = 'Faisal';
self.MyComplexSubType = new MyComplexSubType();
}
function MyComplexSubType() {
var self = this;
self.Age = 26;
}
JSFIDDLE示例
我也做过类似的事情,经过了很多尝试和错误,但我做到了这一点:
var StandardItemModel = function (item, cartItemTypes) {
var self = this;
ItemModel.call(self, item)
}
然后,您需要添加一个原型构造函数:
StandardModel.prototype = new ItemModel();
如果你想拥有通用的方法,那么你需要使用prototype将它们添加到基类中,然后使用在更高的类中调用它们
ItemModel.prototype.methodName.call(self, parameters);
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- 从控制器继承了隔离的作用域以生成可重用的指令
- 骨干模型默认值-todos.js示例中不必要的代码
- 环回中持久化模型之间的继承
- 主干类模型未继承默认值
- 为什么使用CoffeeScript类继承时主干模型不能正常工作
- 从父模型继承主干属性
- 这是JavaScript's的原型继承模型
- 若模型是基于RubyonRails4上的单表继承创建的,那个么如何制作下拉列表
- 如何使主干模型继承THRE.Object3D的原型
- 用继承的数据敲除js嵌套模型
- 继承jQuery's事件模型
- 演示Javascript继承与基于类的模型的关系
- 使用Durandal时的视图模型继承
- Backbone.js模板并没有从模型继承属性
- 淘汰JS模型继承
- Knockout.js视图模型中的继承
- KineticJS的继承模型是如何工作的?