Ответ 1
Передайте наблюдаемые в конструктор виджета в качестве аргументов и дайте виджет подписаться или преобразовать его с помощью дополнительных монад, прежде чем передавать его его конструкторам суб-виджета. Виджет будет управлять своими подписками.
Если виджет создает данные (например, пользовательский ввод), выставляйте его как наблюдаемые свойства в виджетах.
Обратите внимание, что сами виджеты не являются частью наблюдаемого потока. Они просто потребляют входные потоки и создают выходные потоки.
// main app
var someState = Rx.Observable....;
var someWidget = createSomeWidget(someState, ...);
var s = someWidget.userData.map(...).subscribe(...);
// SomeWidget
var SomeWidget = function ($element, state, ...) {
this.userData = $element
.find("button.save")
.onAsObservable("click")
.map(...collect form fields...);
// we need to do stuff with state
this.s = state.subscribe(...);
// we also need to make a child widget that needs some of the state
// after we have sanitized it a bit.
var childState = state.filter(...).map(...)...;
this.childWidget = new ChildWidget(childState, ...);
// listen to child widgets?
}
И так далее. Если вы используете Knockout, вы можете использовать ko.observable
для создания двухсторонних наблюдаемых потоков и иногда избегать необходимости добавлять свойства вывода в свои виджеты, но это целая тема:)