2013-01-09 17 views
11

Esiste comunque la possibilità di evitare l'esecuzione di codice osservabile in alcuni casi?Come impostare una proprietà che è osservabile ma non eseguire la funzione osservabile per alcuni casi in EmberJS

Come ho provato? L'unico modo che ho trovato di evitare è l'aggiunta di nuove proprietà alla vista come flag che verranno verificate prima di eseguire il codice del metodo osservabile.

Questa è la jsfiddle collegamento di base sto fornendo con funzionalità di base osservatore 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); 

risposta

11

Un'alternativa è quella di aggiungere/rimuovere gli osservatori in fase di esecuzione. Dato l'esempio di cui sopra, è possibile impedire osservatore essere licenziato durante init() chiamando this.addObserver dopo che il valore è stato inizializzato

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' 
    }) 

Vai a questa jsfiddle per un esempio di lavoro: http://jsfiddle.net/NSMj8/1/

C'è una buona visione di osservatori nelle guide tempora: http://emberjs.com/guides/object-model/observers/

Maggiori informazioni su come aggiungere/rimuovere gli osservatori è disponibile nella documentazione API per Ember.Observable: http://emberjs.com/api/classes/Ember.Observable.html

+0

Yea h, eri solo più veloce :), +1 BTW :) –

+0

quel codice era solo un esempio per lavorarci .. sono d'accordo che possiamo aggiungere osservatore durante l'inizializzazione .. volevo sapere se c'è comunque che possiamo evitare la chiamata all'osservatore prima di impostare un valore per la proprietà ... – thecodejack

+0

Non sai cosa stai chiedendo esattamente. Il 'lavoro' di un osservatore è quello di ricevere una notifica quando una proprietà cambia. Sicuramente puoi evitare le chiamate agli osservatori aspettando fino a tardi per crearle, come nell'esempio precedente. Una variazione sarebbe avere un osservatore che aggiunge un altro osservatore e magari rimuove se stesso. Con quello in atto si potrebbe "evitare" l'osservatore principale sul set iniziale della proprietà. E 'questo quello che stai andando? –

Problemi correlati