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 继承分两部分完成。第一个在构造函数中,第二个在原型上(你没有使用,所以你可以跳过)。

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

最后一点,关于覆盖load,这与通常在视图模型上放置load函数没有什么不同。Javascript 允许你用任何东西覆盖任何对象的属性,这里没有特殊的步骤。

这是一个演示继承的小提琴。

于 2013-05-15T16:25:51.943 回答