19

私は最近、多くのプロジェクトで Knockout.js を使用しており、多くの繰り返しコードを書いています。BaseViewModelクラスを定義して、ページ固有の ViewModel をクラスから継承できるようにしたいと考えています。これをJavascriptで行う方法について少し混乱しています。これが私の基本BaseViewModelです:

(function (ko, undefined) {
    ko.BaseViewModel = function () {
        var self = this;
        self.items = ko.observable([]);
        self.newItem = {};
        self.dirtyItems = ko.computed(function () {
            return self.items().filter(function (item) {
                return item.dirtyFlag.isDirty();
            });
        });
        self.isDirty = ko.computed(function () {
            return self.dirtyItems().length > 0;
        });
        self.load = function () { }
    };
}(ko));

loadのようにメソッドのシグネチャを一覧表示BaseViewModelし、継承する ViewModel でそれらの定義を提供できるようにしたいと考えています。これは可能ですか?オンラインでいくつかの解決策を見つけましたが、それらはすべて関数/クラスを定義して継承を機能させることに依存しています。

4

2 に答える 2

18

BaseViewModelすべてのプロパティ/メソッドを (プロトタイプを使用せずに) 追加するだけなので、this非常に簡単です。

新しいビュー モデルでは、次のように呼び出しますBaseViewModel

var MyVM = function () {
    var self = this;
    ko.BaseViewModel.call(self);

    self.somethingElse = ko.observable();
    self.itemCount = ko.computed(function() { return self.items().length; });
    self.items([1, 2, 3]); 
};


// ...
var vm = new MyVM();
于 2013-05-15T16:12:57.387 に答える
10

Javascript の継承は 2 つの部分で行われます。1 つ目はコンストラクター内にあり、2 つ目はプロトタイプ上にあります (これは使用していないため、スキップできます)。

var ViewModel = function(data) {
    BaseViewModel.call(this);
};
//you only need to do this if you are adding prototype properties
ViewModel.prototype = new BaseViewModel();

最後に、オーバーライドについては、ビューモデルに通常どおり関数を配置するloadのと同じです。loadJavascript を使用すると、任意のオブジェクト プロパティを任意のもので上書きできます。特別な手順はありません。

これは、継承を示すフィドルです。

于 2013-05-15T16:25:51.943 に答える