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