У меня есть один ItemView, где я использую функцию clearSearch(). Мне нужно вызвать ту же функцию в другом ItemView, поэтому, чтобы она была DRY, я попытался вызвать clearSearch(), но я не работал.
View.Panel = Marionette.ItemView.extend({
template: panelTpl,
events: {
'click .search_clear': 'clearSearch',
}
clearSearch: function() {
//some important actions
}
});
View.Pagination = Marionette.ItemView.extend({
template: paginationTpl,
events: {
'click .page': 'changePage'
},
changePage: function(e) {
//others important actions
clearSearch();
}
});
Я также пытался использовать View.Panel.clearSearch()
, но у меня есть эта ошибка:
Uncaught TypeError: Object function() {return i.apply(this, arguments)} не имеет метода clearSearch
.
использовать события.
определить глобальную шину событий:
Event.Dispatcher = _.clone(Backbone.Events);
и в вашем представлении с разбивкой по страницам.
View.Pagination = Marionette.ItemView.extend({
template: paginationTpl,
events: {
'click .page': 'changePage'
},
changePage: function(e) {
//notify page change event
Event.Dispatcher.trigger("pageChanged", [pass any data you want to pass]);
}
});
в вашем представлении панели, послушайте это событие и определите, как его обрабатывать.
View.Panel = Marionette.ItemView.extend({
template: panelTpl,
events: {
'click .search_clear': 'clearSearch',
},
initialize: function() {
//listen to that event
this.listenTo(Event.Dispatcher, 'pageChanged', this.clearSearch);
},
clearSearch: function() {
//some important actions
}
});
У меня нет опыта работы с Marionette. Могут быть более легкие способы реализации этого с помощью Marionette, но это шаблон, который я использовал в своих чистых приложениях с ванильной основой.
С помощью Marionette вы также можете использовать Triggers, которые запускают события в этом представлении. Например:
View.Panel = Marionette.ItemView.extend({
template: panelTpl,
triggers: {
'click .search_clear': 'panel:clearSearch'
}
});
myPanel.on('panel:clearSearch', function(args){
//some important actions
});