Подтвердить что ты не робот

Нокаут базовый класс ViewModel, наследование Javascript

В последнее время я использую Knockout.js для многих проектов, и я пишу много повторяющегося кода. Я хотел бы иметь возможность определить класс BaseViewModel и унаследовать от него мои ViewModels, специфичные для этой страницы. Я немного смущен о том, как это сделать - 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. Возможно ли это? Я нашел несколько решений в Интернете, но все они полагаются на определение функций/классов, чтобы заставить наследование работать.

4b9b3361

Ответ 1

Так как ваш 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();

Ответ 2

Наследование 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 позволяет переопределить любые свойства объектов с помощью чего-либо, здесь нет специальных шагов.

Вот скрипка, демонстрирующая наследование.