かなり大規模で複雑な既存のアプリケーションをEmberの世界に移植する試みの一環として、名前付きハンドルバーテンプレートを動的に生成およびコンパイルし、次の手法を使用してビューをそれらに関連付けています。
var template = Ember.Handlebars.compile("some handlebars stuff");
Ember.TEMPLATES["myTemplate"] = template;
var view = Ember.View.create({
templateName: "myTemplate"
});
私がやりたいことの1つは、「myTemplate」という名前のテンプレートを上書きし、その名前のビューにアクセスできるようにする、新しい/異なるHandlebarsテンプレートマークアップを再コンパイルできるようにすることです。
これを実行しようとすると、予期しない結果が発生します-問題を説明するいくつかのバイオリン:
最初のフィドル-名前付きテンプレートの内容が変更された後、ビューをレンダリングする前に待機するとどうなるかを示します。
2番目のフィドル-名前付きテンプレートの内容が変更された後、ビューをレンダリングする前に遅延がない場合に何が起こるかを示します。
明らかに、私が理解していない内部の魔法がいくつかあります。誰かがこれに光を当てることができますか?
アップデート:
Ember.Viewとコンテナーモジュールのソースコードを調べたところ、コンテナーキャッシュルックアップをスキップする方法で「テンプレート」計算プロパティをオーバーライドすることで、最初のフィドルの問題を解決できることに気付きました。私が見つけた解決策を示すために、ここに別のフィドルを置きました。
これは私が望むように機能しているようですが、後で私を噛むかもしれない方法で、フレームワークと戦い、コンテナから「フックを外す」ように感じます。私がやろうとしていることを達成するための、より良い、よりエンバー風の方法はありますか?私が見つけたハックは物事を壊しますか?
更新2
また、単に電話をかけることも可能であることを発見しました
view2.get('container').reset();
最初のフィドルにview2を追加する前。よりクリーンで安全なようですが、それは「合法」ですか?これを説明するために最初のフィドルを更新しました。