25

アプリケーションに 3 つの比較的類似したノックアウト モデルがあり、3 回繰り返すのではなく、基本モデルを拡張して共通のプロパティを組み合わせたいと考えています。

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 を基本クラスとして使用し、必要に応じて追加のプロパティを追加したいと考えています。

4

5 に答える 5

41

このように ko.utils.extend を使用できると思います

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

StandardItemModel 内

このように: http://jsfiddle.net/marceloandrader/bhEQ6/

于 2013-02-19T21:44:47.590 に答える
0

次のようなことができると思います:

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);
}
于 2013-02-19T19:36:17.390 に答える
0
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 の例

于 2014-11-20T05:35:40.340 に答える
0

.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、アンダースコアなどの同様のメソッド)に対する利点は、メソッドへの参照を取得するためだけに追加のオブジェクトを作成しないことです。

于 2016-02-04T01:45:35.183 に答える
-1

私は多くの試行錯誤を重ねて同様のことをしましたが、これでうまくいきました:

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

次に、プロトタイプ化されたコンストラクターを追加する必要があります。

StandardModel.prototype = new ItemModel();

共通のメソッドが必要な場合は、prototype を使用してそれらを基本クラスに追加し、次を使用して上位クラスで呼び出す必要があります。

ItemModel.prototype.methodName.call(self, parameters);
于 2013-02-19T19:24:22.227 に答える