Ответ 1
Я думаю, вы можете использовать ko.utils.extend вроде этого
ko.utils.extend(self, new ItemModel(item));
внутри StandardItemModel
У меня есть три относительно похожих модели нокаута в моем приложении, и я хотел бы расширить базовую модель, чтобы объединить общие свойства, а не повторять три раза.
Пример
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
Я думаю, вы можете сделать что-то вроде этого:
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);
}
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;
}
Я сделал что-то похожее, с большим количеством проб и ошибок, но у меня это получилось для меня:
var StandardItemModel = function (item, cartItemTypes) {
var self = this;
ItemModel.call(self, item)
}
Затем вам нужно добавить прототипированный конструктор:
StandardModel.prototype = new ItemModel();
Если вы хотите иметь общие методы, вам нужно добавить их в базовые классы, используя прототип, чтобы добавить их, а затем вызвать их в более высоком классе, используя:
ItemModel.prototype.methodName.call(self, parameters);
Вы можете связать вызовы конструктора с помощью .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, underscore и т.д.) заключается в том, что вы не создаете дополнительный объект, чтобы просто ссылаться на его методы.