2011-09-13 15 views
11

Korzystanie z Backbone.js Wiem, że zdecydowanie zaleca się ustawienie właściwości modelu za pomocą metody set, a NIE przez bezpośrednią modyfikację attributes internal hash.backbone.js zestaw atrybutów wewnętrznych modelu mieszania bezpośrednio

Jednak oprócz automatycznego wyłączania zdarzenia "zmień", jakie inne minusy lub "skutki uboczne" występują w modyfikowaniu wewnętrznego skrótu?

Problem, przed którym stoję, polega na tym, że podczas, gdy metoda set przyjmuje literał obiektu, muszę przypisać lewą stronę za pomocą zmiennej określonej w czasie wykonywania. Dzięki.

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

Odpowiedz

15

Cóż, jeśli spojrzeć na annotated source code, przekonasz się, że set robi dużo.

Co jeśli przedłużony Backbone.Model z funkcji, która zrobi to za ciebie:

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

Następnie można po prostu robić to, co chcesz bezpośrednio na modelu:

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

który czuje jak lepsze rozwiązanie dla mnie.

Edit

Jako @ earl3s zauważył, to nie jest już konieczne w nowszych wersjach Backbone. Dziś możesz po prostu zadzwonić pod numer model.set(myProperty, "bar") i robi to, co chcesz.

+1

Myślę, że twoje rozwiązanie jest genialne. Ta funkcja powinna zostać połączona z nowszymi wersjami Backbone! Dziękuję również za wskazanie opatrzonego adnotacją kodu źródłowego; masz rację, powinienem spojrzeć na to w pierwszej kolejności. – fortuneRice

+0

fajnie! Napisałem ten kod kilkanaście razy i nigdy nie pomyślałem, żeby to była metoda. :) btw: nie ma potrzeby używania _.extend do tego. 'Backbone.Model.prototype.setByName = function (...) {...}' robi to samo ... funkcjonalnie to samo. tylko inny sposób na zrobienie tego. –

+0

@Derick Bailey: Śmieszne ... Pomyślałem, że '_.extend' ma trochę sprytu do rozszerzania prototypów ... nie. To naprawdę rozszerzenie każdego obiektu o kolekcję zmian. Nic tam nie jest szalone. Zmieniam moją odpowiedź, aby to potwierdzić. Dzięki. –

7

W wymienionym przez Briana Genisio numerze annotated source code można przeczytać następujące wiersze: "Obsługuj oba argumenty" klucz ", wartość i {klucz: wartość}.". Więc możesz po prostu użyć modelu.set (myProperty, "bar", opcje). Być może dodali tę funkcję po wpisie Briana Genisio .. nie wiem.

+0

To jest poprawne rozwiązanie. Funkcjonalność już istnieje w metodzie "set". – earl3s

Powiązane problemy