2013-04-11 13 views
17

Jest to znana cecha backbone.js że po ustawieniu danych, które nie zmieniło się to nie będzie ognia zdarzenie zmieni, ani nie przechodzą walidacji. Potrzebuję jednak zdarzenia zmiany, aby wystrzelić, ponieważ przechowuję odpowiedź JSON z wywołania AJAX, która przechowuje wyniki sprawdzania poprawności zaplecza. Jeśli użytkownik nadal przesyła formularz, pozostawiając puste pole, walidacja backendu zwróci ten sam wynik JSON, a po zapisaniu go w modelu nie spowoduje zdarzenia zmiany.wyzwalania backbone.js zmienia się, gdy wartość nie zmienia

kilka rzeczy próbowałem w sukces wywołania zwrotnego AJAX gdzie ustawić dane do modelu

Próba Rozwiązanie nr 1

t.model.unset('fieldErrors',{silent: true}); 
t.model.set({fieldErrors: JSONResponse}); 

Próba Rozwiązanie nr 2

t.model.set({fieldErrors: null},{silent: true}); 
t.model.set({fieldErrors: JSONResponse}); 

Żadna z tych wyników w przypadku zmian odpalanych po raz drugi, gdy połączenie jest wykonane, a użytkownik ma ten sam JSONResponse.

+0

Jeśli nie boi boilerplate, patrz odpowiedź ScottPuleo użytkownika. W przeciwnym razie możesz przesłonić metodę 'Model # set', aby zawsze uruchamiać zdarzenie niestandardowe (opublikuję odpowiedź, jeśli jesteś zainteresowany). – Loamhoof

Odpowiedz

27

ręcznie wywołać zdarzenie change:

t.model.trigger('change', t.model); 

lub

t.model.trigger('change:fieldErrors', t.model, newFieldErrorsValue); 
+5

Ten drugi przypadek (losowej opcji) prawdopodobnie nigdy nie powinien być używany. Potrzebna jest tutaj metoda "wyzwalacza". Pamiętaj, aby przekazać parametry niezbędne, ponieważ kręgosłup nie zrobi tego za ciebie, gdy uruchomisz ręcznie. –

+2

Uwaga: "Ten drugi przypadek" odnosi się do starego przypadku, który został usunięty. – Chris

+0

@Scott Puleo To stara sprawa, ale zastanawiałem się, czy mógłby pan wyjaśnić, dlaczego musimy przechodzić samego modelu jako drugi argument do 'trigger'? Kiedy tego nie robię, 'Collection._onModelEvent' - który jest wywoływany później - nie otrzymuje modelu. Wydaje mi się, że 'model.trigger ('change')' powinno wystarczyć do przekazania modelu do tego późniejszego zdarzenia. Czy wiesz, dlaczego tak nie jest? (przepraszam, jeśli moje pytanie nie jest jasne ...) – arnaudrg

Powiązane problemy