2012-03-27 8 views
5

W backbone.js zauważyłem, że zdarzenia change i all na Model nie będą wywoływać ataków tego modelu w przypadku istniejących atrybutów.backbone.js: Zdarzenie modelujące, które jest uruchamiane podczas ustawiania atrybutów do istniejących wartości?

Na przykład, jeśli mogę skonfigurować następujące zdarzenia:

ActiveUser.bind('change', this.displayActiveUser, this); 
ActiveUser.bind('all', this.displayActiveUserAll, this); 

I wtedy ręcznie ustawić wartość ActiveUser do pustego ciągu znaków:

ActiveUser.set({ text : '' }); 

ogniu wydarzeń wtedy i tylko jeśli ActiveUser.text nie jest już ustawiony na pusty ciąg znaków.

Jest to rozsądne zachowanie. Jednak czy istnieje zdarzenie, które mogę wykorzystać, które zostanie uruchomione, nawet jeśli ustawiona wartość jest wartością istniejącą?

Aktualizacja: Nie widzę niczego w oficjalnym pliku Backbone.js list of events. Hmm.

+2

Zawsze możesz ręcznie uruchomić 'ActiveUser.trigger ('change')' – abraham

+0

Dzięki - właśnie to zrobię! – Richard

+0

Dodałem mój komentarz jako odpowiedź. – abraham

Odpowiedz

8

Zawsze można wyzwalać zdarzenia zmiany ręcznie z ActiveUser.trigger('change');.

1

Wygląda na to, że potrzebna jest podklasa Backbone.Model, która jest klasą nadrzędną którejkolwiek z klas modeli, które chcą tego zachowania. Zastąp metodę set czymś wzdłuż tych linii. Logika wywoływania zdarzeń tylko w przypadku zmian jest kodowana w Backbone.Model.set w sposób, który nie ułatwia obsługi dodawania nowej opcji.

(... fragment ...)

set: function(key, value, options) { 
    //Handle both "key", value and {key: value} -style arguments. 
    if (_.isObject(key) || key == null) { 
     options = value; 
    } 
    this.change(options); //This fires the event 
    Backbone.Model.prototype.set.apply(this, arguments);//Trigger normal behavior as well 
3

wydarzenie zmiana wyzwalania ręcznego jak Abraham powiedział

MyModel.trigger('change') 

więc jej możliwość ręcznego wywołania zdarzenia change ale to nie będzie dobrze działać w niektórych przypadkach. Rozważmy przypadek, gdy twoja metoda renderowania pobiera właściwości z modelu, a twój model jest początkowo pusty, więc jeśli twój kod ustawia coś na modelu i tuż po tej linii mówisz MyView.render() lub MyModel.trigger('change'), to co się stanie, twoja metoda renderowania może być szybsza i nawet nie będzie nowo ustawione właściwości.

Szybkie hacky Alternatywą może być za każdym razem gdy coś ustawić, generowanie liczb losowych wzdłuż i przekazać je do modelu

MyModel.set({myProperty:something,rand:Math.random()}); 

lub

MyModel.set({myProperty:something,t:(new Date).getTime()}); 

Więc w tym przypadku masz pewność, że model będzie zawsze zdarzenie zmiany ognia, ponieważ coś się zmienia, ale jest hacky i jeśli dużo się dzieje, to aplikacja stanie się losowym kalkulatorem liczb.

Można również użyć metody Petera Lyonsa.

+0

Ta hackowata alternatywa na pewno działa, ale prosty spust jest o wiele bardziej oczywisty. –

Powiązane problemy