Say У меня есть два компонента на странице, где пользователь может взаимодействовать с одной и другой должны обновить, что-то вроде ниже:Backbone.Radio для межкомпонентной связи
component A | component B
|
- option 1 link | "stuff related to option 1"
- option 2 link |
Теперь, когда мы щелкаем option 2 link
мы хотим обновить компонент B.
MarionetteJS использует (или будет так в следующем основном выпуске) Backbone.Radio.
Я хотел бы знать лучший способ сделать это. 2 вещи приходят на ум:
1: Используйте тот же канал в обоих компонентах
// Component A
// ...
onOptionClick: function (evt) {
Backbone.Radio.channel('AvsB').request('update:b', {id: this.model.get('id')});
}
// Component B
// ...
initialize: function() {
Backbone.Radio.channel('AvsB').reply('update:b', function() {
// update contents...
}
}
2: Отделить еще больше, с помощью посредника, например: компоненты должны использовать только свой «собственный» канал.
// Component A
// ...
onOptionClick: function (evt) {
Backbone.Radio.channel('compA').request('option:isUpdated', {id: this.model.get('id')});
}
// Mediator (eg. main.js, a controller, or whatever high-level object)
var channelCompA = Backbone.Radio.channel('compA');
var channelCompB = Backbone.Radio.channel('compB');
channelCompA.reply('option:isUpdated', channelCompB.request('content:shouldUpdate'));
// Component B
// ...
initialize: function() {
Backbone.Radio.channel('compB').reply('content:shouldUpdate', function() {
// update contents...
}
}
Вариант 2 - больше работы и кажется немного ненужным. Но я не могу пошатнуть чувство, что вариант 1 все еще слишком специфичен. В конце концов, компонент A не должен заботиться о том, что компонент B существует.
Да, вы правы, выбирая правильные имена (всегда сложно) и переходите к вариантам 1, это лучший способ пойти. Спасибо, что помогли мне разобраться в одном направлении;) Я переработал свой код, и теперь он выглядит намного чище. Прекрасный. – publicJorn