淘汰赛JS型号继承(Knockout JS Model Inheritance)

2019-07-20 04:26发布

我在我的应用程序三个相对同类机型的淘汰赛,我想扩展基本模型,以共同属性结合在一起,而不是重复自己的三倍。

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作为一个基类,只需添加额外的属性是必要的。

Answer 1:

我想你可以使用ko.utils.extend这样

ko.utils.extend(self, new ItemModel(item));

该StandardItemModel内

像这样: http://jsfiddle.net/marceloandrader/bhEQ6/



Answer 2:

我想你可以做这样的事情:

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);
}


Answer 3:

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



Answer 4:

我做过类似的东西,有很多试验和错误的,但我得到这个工作对我来说:

var StandardItemModel = function (item, cartItemTypes) {
    var self = this;
    ItemModel.call(self, item)
}

然后,您需要添加一个原型构造函数:

StandardModel.prototype = new ItemModel();

如果你想拥有常用的方法,那么你就需要使用原型添加它们,将它们添加到基类,然后打电话给他们在使用更高等级:

ItemModel.prototype.methodName.call(self, parameters);


Answer 5:

你可以链构造函数调用使用.CALL或。适用

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的或类似的方法,下划线等)是没有创建另外一个目的只是为了抢它的方法引用。



文章来源: Knockout JS Model Inheritance