2013-02-13 4 views
9

Ho visto un sacco di domande su questo sul web (SOF e Google) ma finora nessuna risposta chiara al problema.Come ottenere un riferimento su un'istanza di visualizzazione in ember/emberjs da javascript statico?

Ho una normale applicazione Ember con varie viste e controller. Una delle mie viste ha un metodo di istanza che vorrei chiamare da un contesto statico. Così in un normale file javascript. Dovrei ottenere un riferimento alla vista instanciata da ember per chiamare il metodo?

Poche righe di codice per illustrare il mio problema:

In ApplicationView.js:

App.ApplicationView = Em.View.extend({ 
    templateName: 'application', 

    myInstanceMethod:function() { 
     this.anotherInstanceMethod(some, params); 
    }, 
    // ... more code 
}); 

In MyUtils.js:

var myUtils = myUtils || { 
    myMethod: function() { 
     myApplicationViewInstance.myInstanceMethod(); 
    } 
}; 

risposta

6

Questo è il mio personale approccio a questo problema. Sto usando "didInsertElement" di Ember.View per registrare la vista in un posto centrale. Questo funziona bene per le viste singleton. Per le visualizzazioni non singleton, si dovrebbe sviluppare un ViewRegistry più sofisticato.

Ember Parte

var App = Ember.Application.create({ 
    viewRegistry : { 
     applicationView : null 
    }, 
}); 

App.ApplicationView = Ember.View.extend({ 
    templateName : 'application', 
    didInsertElement : function(){ 
     App.set("viewRegistry.applicationView", this); 
    } 
}); 

In MyUtils.js:

var myUtils = myUtils || { 
    myMethod: function() { 
     App.get("viewRegistry.applicationView").myInstanceMethod(); 
    } 
}; 
+0

Bella presa. Ho scoperto che come avevo registrato il mio applicationController nel router, ho potuto accedere al mio applicationView facendo App.get ('router.applicationView') come fai con il tuo registro! Thx – Sephy

3

Ember ha già un "hash vista globale"

ricerca ember.js per Ember.View.views = {}

Si è indicizzato da ogni vista elemento id, in modo da ottenere una vista è facile come:

myView = Ember.View.views[$('.myViewSelector').attr('id')] 

Il mio mentore tuttavia ritiene che con questo metodo è un hack sporco e mi ha consigliato di trovare un modo migliore. Aveva scritto un test aiutante:

window.lookupView = function(key) { 
    var activeViews = app.__container__.lookup('router:main')._activeViews; 
    if(!activeViews) { throw new Error("No active views."); } 
    if(!activeViews[key]) { throw new Error("No view '%@'.".fmt(key)); } 
    return activeViews[key][0]; 
}; 

che ho usato per ottenere il mio parentView desiderata e poi tutti i bambini con parentView.get('childViews')

+0

Grazie - questo sembra essere l'approccio attualmente raccomandato da Ember per trovare una vista dall'ID dell'elemento DOM. Vedi http://emberjs.com/guides/understanding-ember/debugging/#toc_get-the-view-object-from-its-dom-element-s-id –

Problemi correlati