2013-11-25 2 views
1

У меня есть следующий ItemView, который обернут внутри CollectionView:Как можно вызвать функцию ItemView вручную?

define(deps, function($, _, Backbone, CountriesTemplate, Globals) { 
    return Backbone.Marionette.CollectionView.extend({ 
    tagName: 'ul', 
    className: 'unstyled countries', 
    itemView: Backbone.Marionette.ItemView.extend({ 

     tagName: 'li', 
     template: CountriesTemplate, 

     events: { 
     'change': 'toggleState' 
     }, 

     triggers: { 
     'click': 'toggleState' 
     }, 

     toggleState: function() { 
     var index = Globals.defaultCountries.indexOf(this.model.id); 
     index === -1 ? Globals.defaultCountries.push(this.model.id) : Globals.defaultCountries.splice(index, 1); 
     this.model.set('checked', !this.model.get('checked')); 
     } 
    }) 
    }); 
}); 

Коллекция связана со списком флажков и вручную связан с элементами SVG круга, которые представляют страну. Проверка/снятие флажков не является проблемой и вызывает toggleState, как и должно быть. Проблема возникает при попытке вручную инициировать событие при щелчке по элементу окружности svg.

Код, который пытается вызвать событие щелчка вручную:

// country is a "model" 
checkbox.prop('checked', true); 
// Changes the checked attribute but does not call toggleState.   
country.set('checked', true); 
// Nothing happens here. 
country.trigger('click'); 

Итак, что это правильный метод для вызова toggleState вручную?

Update:

Используя ответ damienc88 «S я сделал следующие изменения внутри itemView сделать спусковую работу.

itemView: Backbone.Marionette.ItemView.extend({ 
    tagName: 'li', 
    template: CountriesTemplate, 

    events: { 
    'change': 'toggleState' 
    }, 

    initialize: function() { 
    this.listenTo(this.model, 'toggleState', this.toggleState); 
    }, 

    toggleState: function() { 
    // Code. 
    } 
}) 

Вызов model.trigger('toggleState') снаружи теперь работает как положено.

ответ

1

Если вы пытаетесь вызвать toggleState на ItemView напрямую, вы можете просто позвонить itemView.toggleState(); Это работает только в том случае, если у вас есть доступ к этому конкретному объекту itemView. Возможно, вы этого не знаете.

В качестве альтернативы, вы можете вызвать событие на модели, и ItemView может прослушивать это событие на своей модели:

this.listenTo(this.model,'toggleState',this.toggleState). Затем вашему CollectionView необходимо позвонить model.trigger('toggleState').

Смежные вопросы