2013-01-09 8 views
11

Czy w niektórych przypadkach możemy uniknąć uruchamiania obserwowalnego kodu?Jak ustawić właściwość, która jest obserwowalna, ale nie działa funkcja obserwowalna dla kilku przypadków w EmberJS

Jak próbowałem? Jedyny sposób, którego uniknąłem, polega na dodaniu do widoku nowych właściwości jako flag, które zostaną zaznaczone przed uruchomieniem obserwowalnego kodu metody.

Jest to podstawowa jsfiddle Link dostarczam z podstawowych funkcji obserwatora HTML

<script type="text/x-handlebars" data-template-name="application"> 
    {{view MyApp.MyContainerView name="Santa Claus"}} 
</script> 
<script type="text/x-handlebars" data-template-name="foo"> 
    {{view.testProp}} 
</script> 

JS

MyApp = Ember.Application.create({ 
    autoinit: false 
}); 

MyApp.router = Ember.Router.create({ 
    root: Ember.Route.extend({ 
     index: Ember.Route.extend({ 
      route: '/' 
     }) 
    }) 
}); 

MyApp.ApplicationController = Ember.Controller.extend({}); 

MyApp.MyContainerView = Em.ContainerView.extend({ 
    childViews: ['foo'], 

    foo: Em.View.extend({ 
     testProp: 100, 
    testPropObservable: function(){ 
    console.log("Prop Observed"); 
    }.observes('testProp'), 
     init: function() { 
      this._super(); 
      this.set('testProp', 200);//i want to avoid obeserver here 
     }, 
     templateName: 'foo' 
    }) 
}); 

MyApp.initialize(MyApp.router); 

Odpowiedz

11

Jedną z możliwości jest dodawanie/usuwanie obserwatorów w czasie wykonywania. Biorąc pod uwagę powyższy przykład, można zapobiec obserwatora z wyrzuceniu podczas init() przez wywołanie this.addObserver po wartość została zainicjowana

foo: Em.View.extend({ 
     testProp: 100, 
     testPropDidChange: function(){ 
     console.log("Value changed to: ", this.get('testProp')); 
     }, 
     init: function() { 
     this._super(); 
     this.set('testProp', 200);//i want to avoid obeserver here 
     this.addObserver('testProp', this.testPropDidChange) 
     }, 
     templateName: 'foo' 
    }) 

Zobacz ten jsfiddle na przykład pracy: http://jsfiddle.net/NSMj8/1/

Jest dobry przegląd obserwatorów w przewodnikach Ember: http://emberjs.com/guides/object-model/observers/

Więcej informacji na temat dodawania/usuwania obserwatorów jest dostępny w docs API dla Ember.Observable: http://emberjs.com/api/classes/Ember.Observable.html

+0

Yea h, byłeś po prostu szybszy :), +1 BTW :) –

+0

ten kod był tylko przykładem do pracy nad nim ... i zgadzam się, że możemy dodać obserwatora podczas inicjalizacji ... chciałbym wiedzieć, czy jest i tak możemy uniknąć połączenie z obserwatorem przed ustawieniem wartości w obiekcie ... – thecodejack

+0

Nie jesteś pewien, o co dokładnie pytasz. "Zadaniem" obserwatora jest uzyskanie powiadomienia, gdy właściwość ulegnie zmianie. Na pewno można uniknąć połączeń z obserwatorami, czekając do ich późniejszego utworzenia, jak w powyższym przykładzie. Odmianą byłoby mieć obserwatora, który dodaje innego obserwatora i może sam siebie usuwa. Dzięki temu można "uniknąć" głównego obserwatora na początkowym zestawie nieruchomości. Czy to właśnie zamierzasz? –

Powiązane problemy