Я изо всех сил пытаюсь найти хороший способ заставить пользовательский элемент общаться с его окружением. Пока моя гугл-карма невелика, и я не нашел ничего, что бы описывало хорошую архитектуру для пользовательских элементов в Knockout.
Как всегда, зависит от того, что считать хорошей архитектурой ;-)
Обновление: я создал скрипт, пытаясь объяснить, что я имею в виду.
В моем случае:
- Я хочу, чтобы пользовательский элемент был действительно автономным.
- Он должен просто работать при добавлении в представление, без ошибок.
- Он вообще не должен взаимодействовать напрямую с какими-либо службами или любыми другими внешними компонентами.
Учитывая пользовательский элемент с одной кнопкой сохранения, которая должна активироваться только после того, как что-то изменилось, мы могли бы передать координатор следующим образом:
function CustomElement(params) {
var coordinator = params.coordinator;
var enabled = this.enabled = ko.observable(false);
this.save = function() {
coordinator.save();
}
coordinator.onchange(function(hasChanges) {
enabled(hasChanges);
});
}
Где родительская модель представления определяет координатора:
function ParentView() {
this.coordinator = new CustomElementCoordinator();
}
И передать его через параметры:
<custom-element params="coordinator: coordinator"></custom-element>
Тогда я думаю, что координатор должен быть определен в том же каталоге, что и пользовательский элемент:
custom-elements
- custom-element
- coordinator.js
- model.js
- template.html
Что вы думаете? Я что-то напутал или неправильно к этому подхожу?