2011-12-20 16 views
6

Kiedy zmienia się mój "chartModel", chcę zaktualizować "globalModel".Make Backbone.js Model zmienić "częściowo" cichy?

chartModel.bind("change", updateGlobalModel); 

updateGlobalModel(){ 
    globalModel.set(obj) 
} 

I vice versa, chcę, aby mój chartModel aktualizował się, gdy zmienił się model globalModel.

globalModel.bind("change", updateChartModel); 

updateChartModel(){ 
    chartModel.set(obj) 
} 

Powoduje to pętlę sprzężenia zwrotnego podczas ustawiania modułu globalnego. Mógłbym temu zapobiec, ustawiając {cichy: prawdziwy}.

Ale tu pojawia się problem. Mam inny model, który jest zależny od zdarzenia change:

globalModel.bind("change", updateOtherModel); 

Jak mogę zaalarmować ten model zmiany, ale nie były jednym (aby uniknąć sprzężenia zwrotnego)?

UPDATE:
Na razie postanowiłem wygenerować konkretny identyfikator dla każdego zestawu rozmowy:

set : function(attrs, options) { 
     if(!("setID" in attrs)){ 
      attrs.setID = myApp.utils.uniqueID(); //newDate.getTime(); 
     } 
     Backbone.Model.prototype.set.call(this, attrs, options); 
    }, 

ten sposób, zawsze mogę wygenerować „setID” atrybut z dowolnego miejsca w moim podanie. Jeśli setID jest taki sam podczas pobierania czegoś z modelu, wiem, że może istnieć ryzyko dla pętli sprzężenia zwrotnego.

Odpowiedz

0

Moja wiedza jest ograniczona, więc może nie powinienem odpowiadać, ale spróbuję przekazać odniesienie do chartModel, gdy zostanie utworzone, które odnosi się do "innego" modelu, który chcesz zaktualizować. Następnie wywołaj zdarzenie na updateChartModel() i upewnij się, że twój "inny" model jest związany z tym zdarzeniem.

Mam następujące pytanie: czy cichy obiekt wycisza wszystkie zdarzenia? Lub tylko modelowe? To oczywiście nie zadziała, jeśli wszystkie zdarzenia zostaną wyciszone.

+0

Dzięki za sugestię - wypróbuję, jeśli moje obejście się nie powiedzie (zaktualizowałem moje pytanie.) – dani

1

Lepiej późno niż wcale ..

Najprostszym sposobem na to jest za pomocą flag. Na przykład, ustawiając coś w globalModel, możesz również zmienić właściwość modelu, aby wskazać, że coś zmieniłeś. Następnie możesz zweryfikować wartość tej flagi pod numerem updateChartModel. Na przykład:

chartModel.bind ("change", updateGlobalModel);

function updateGlobalModel() { 
    if (!flag) { 
     globalModel.set(obj); 
     flag = true; 
    } 
} 

Prawdopodobnie bardzo podobne do tego, co zrobiłeś ze swoim identyfikatorem setID. Na marginesie, podkreślenie ma wbudowaną funkcję uniqueId.

Inną rzeczą, którą możesz zrobić, która jest znacznie czystsza, jest przekazanie opcji z zestawami połączeń.

chartModel.set(obj, { notify : false }); 

Tak, można przekazać dowolne opcje, nie jesteś ograniczony tylko do { silent : true }. Aby uzyskać więcej informacji, patrz this discussion on github. Następnie należy sprawdzić istnienie tej nieruchomości gdzie obsłużyć zdarzenia zmian tak:

function updateGlobalModel(model, options){ 
    // explicitly check for false since it will otherwise be undefined and falsy 
    // you could reverse it.. but I find this simpler 
    if (options.notify !== false) { 
     globalModel.set(obj) 
    } 
} 

a swoją trzecią (i inne modele), można po prostu zrezygnować z tej kontroli.

Ostateczną opcją jest oczywiście spojrzenie na swój projekt. Jeśli te dwa modele są tak blisko ze sobą powiązane, że muszą być zsynchronizowane ze sobą, być może ma sens scalenie ich funkcjonalności. Alternatywnie możesz podzielić wspólną funkcjonalność. Wszystko to zależy w dużej mierze od konkretnej sytuacji.

Powiązane problemy