9

ウェブ(SOFとGoogle)でそれについて多くの質問を見てきましたが、これまでのところ、この問題に対する明確な答えはありません。

私はさまざまなビューとコントローラーを備えた通常のEmberアプリケーションを持っています。私のビューの1つに、静的コンテキストから呼び出したいインスタンスメソッドがあります。したがって、通常のjavascriptファイルでは。メソッドを呼び出すために、残り火によってインスタンス化されたビューへの参照を取得する必要がありますか?

私の問題を説明するための数行のコード:

ApplicationView.jsの場合:

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

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

MyUtils.jsの場合:

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

2 に答える 2

6

これは、この問題に対する私の個人的なアプローチです。Ember.View の「didInsertElement」を使用して、ビューを中央の場所に登録しています。これは、シングルトン ビューに適しています。非シングルトン ビューの場合、より洗練された ViewRegistry を開発する必要があります。

エンバーパート

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

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

MyUtils.js で:

var myUtils = myUtils || {
    myMethod: function() {
        App.get("viewRegistry.applicationView").myInstanceMethod();
    }
};
于 2013-02-13T12:53:14.477 に答える
3

Emberにはすでに「グローバルビューハッシュ」があります

検索ember.jsするEmber.View.views = {}

すべてのビューの要素 ID によってインデックスが作成されるため、ビューを取得するのは次のように簡単です。

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

しかし、私のメンターは、この方法を使用するのは汚いハックであると考えており、より良い方法を見つけるようにアドバイスしてくれました. 彼はテストヘルパーを書きました:

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];
};

これを使用して、目的のparentViewを取得し、次に子を取得しましたparentView.get('childViews')

于 2014-01-15T00:42:30.390 に答える