I have seen a lot of questions about that on the web (SOF and Google) but so far no clear answer to the issue.
I have a usual Ember application with various views
This is my personal approach to this problem. I am using the "didInsertElement" of Ember.View to register the View in a central place. This works well for singleton views. For non-singleton views, one would have to develop a more sophisticated ViewRegistry.
Ember Part
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();
}
};
Ember already has a "Global views hash"
search ember.js
for Ember.View.views = {}
It is indexed by every views' element id, so getting a view is as easy as:
myView = Ember.View.views[$('.myViewSelector').attr('id')]
My mentor however believes using this method is a dirty hack and advised me to find a better way. He had written a test helper:
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];
};
which I used to get my desired parentView and then any children with parentView.get('childViews')