Я работаю над тем, чтобы сделать мое приложение javascript более масштабируемым. Приложение использует Knockout.js для привязки сетки некоторого типа элемента базы данных, который пользователь может редактировать и обновлять. Теперь я иду по пути работы с наследованием и наличием BaseModel и моделей, которые наследуются от него. Проблема, с которой я сталкиваюсь, возникает, когда я хочу переопределить вычисляемый наблюдаемый объект, определенный в BaseModel классом, который наследует от него. Вот вариант использования.
Базовая сетка имеет вычисляемый наблюдаемый объект, к которому привязан пользовательский интерфейс. Вычисляемый наблюдаемый объект работает с наблюдаемым массивом с фильтром текстового поля, который пользователь может ввести для поиска. Довольно простой.
Дочерний класс, роли, представляет собой определенный тип сетки, и часть бизнес-требований заключалась в том, чтобы иметь фильтр для отдела. Это раскрывающийся список в пользовательском интерфейсе. Я хочу переопределить вычисляемый наблюдатель в базовом классе реализацией ролей в дочернем классе. Не уверен, как это сделать.
Вот JSFiddle: http://jsfiddle.net/Icestorm0141/vx6843pt/6/
Модель BaseGridViewModel:
var BaseGridViewModel = function (serverData) {
var self = this;
//searchTerm is a text box that the user types to search
self.searchTerm = ko.observable();
//items are the data from the server
self.items = ko.mapping.fromJS(serverData, mapping);
//filteredItems are the filtered list of items that the grid is actually bound to
//thus when the user searches, the UI updates automatically
self.filteredItems = ko.computed(function () {
if (self.searchTerm() == null || self.searchTerm() == "" || self.searchTerm().length < 3) {
return self.items();
}
else {
return ko.utils.arrayFilter(self.items(), function (item) {
return item.Description().toLowerCase().indexOf(self.searchTerm().toLowerCase()) >= 0;
});
}
});
}
Дочерний класс:
var RoleGridModel = function (roleData) {
var self = this;
//calling the base model, I think this is the proper way to do this?
BaseGridViewModel.call(self, roleData);
//UI has a drop down list of departments to filter by, this is the selected filter
self.departmentFilter = ko.observable();
//I WANT to set the filter function for the items to something completely different
var filterOverride = function () {
if (self.departmentFilter() == null || self.departmentFilter() == "") {
return self.items();
}
else {
return ko.utils.arrayFilter(self.items(), function (role) {
return role.DepartmentId() == self.departmentFilter();
});
}
};
}
Я провел много исследований по этому поводу в последние несколько дней, и я удивлен, что еще не нашел решения. Я не чувствую, что делаю что-то слишком экстраординарное, но, может быть, у кого-то есть какие-то предложения. Я открыт для любого!