2012-01-18 4 views
5

Napotkałem dziwne zachowanie sprawdzania poprawności modelu w pliku Backbone.js.Sprawdzanie poprawności modelu szkieletowego

Kiedy model jest stworzony, jak

var foo = new Foo({ 
    bar: 42 
}); 

Backbone wywołuje foo.set() przekazując jako parametr daną mapę {bar: 42}, jak widać z source. Czyniąc tak, to również przechodzi opcje {silent: true}, jak w wierszu

this.set(attributes, {silent : true}); 

Ma to sens, ponieważ mając silent === true unika wyzwolenie change zdarzenia, które nie mają sensu w tym kontekście.

Z jakiegoś powodu nie mogę zrozumieć, ale silent === true również zapobiega sprawdzeniu poprawności; zobacz źródło na linii

if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; 

Więc wydaje modelu są nigdy zatwierdzone, gdy są one tworzone, ale zwykle są one gdy niektóre atrybuty są zmieniane. Co więcej, obecność walidacji jest nierozerwalnie związana z działaniem wysyłania zdarzeń change, co jest czymś całkowicie ortogonalnym.

Czy ktoś może wyjaśnić, dlaczego tak jest? Jaki byłby czysty i przyszłościowy sposób rozwiązania tego problemu?

mogłem ręcznie wywołać _performValidation, ale ma dwie wady:

  • pierwsze, to jest coś, może po prostu zapomnieć
  • sekundę, _performValidation nie jest częścią API i być może to się zmieni w przyszłych wydaniach.

Odpowiedz

3

Rzeczywiście myślę, że to błąd na Backbone.JS.

Jest kwestią otwartą na GitHub tutaj: https://github.com/documentcloud/backbone/issues/870

Edit: W nowej wersji 0.9.1 z backbone.js, można sprawdzić, czy model ten jest ważny z isValid metody (http://backbonejs.org/#Model-isValid)

+0

OK, dziękuję, myślałem, że czegoś brakuje. – Andrea

+1

Wersja 0.9.9 aktualizacja: Walidacja występuje teraz nawet podczas "cichych" zmian.Ta zmiana oznacza, że ​​metoda isValid została usunięta. Nieudane sprawdzanie poprawności również powoduje błąd, nawet jeśli w opcjach określono odwołanie do błędu. – romanlv

0

od teraz jedynym sposobem na zachowanie bezpieczeństwa jest nie przekazywanie parametrów hasza.

zawsze robię:

var m = new MyModel(); 
// and then I do all the sets 
m.set(...); 
m.set(...); 
m.set(...); 

W przypadku niektórych danych JSON pochodzi z DB, wtedy oni mają zostały zatwierdzone już i tak w tym przypadku dobrze jest:

var m = MyMOdel(hashFromDB); 

Czy to ma sens?