0

かなり大規模で複雑な既存のアプリケーションを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を追加する前。よりクリーンで安全なようですが、それは「合法」ですか?これを説明するために最初のフィドルを更新しました。

4

2 に答える 2

0

(2番目のフィドルでは、両方のビューに2番目のテンプレートが表示されます)

これはview1.appendTo($("#target"));、追加をスケジュールするだけで、実際のビューのレンダリングは実行ループが終了するまで行われないためです。それが起こる前に、あなたは設定しましたEmber.TEMPLATES["myTemplate"] = template2;

(最初のフィドルでは、両方のビューに最初のテンプレートが表示されます)

これは、残り火コンテナがテンプレートfxをキャッシュするためですが、100%ではないことは間違いありません。チェック中...

于 2013-03-25T04:06:58.180 に答える
0

私はこれを答えたと呼ぶつもりです。2番目のコメントで述べたように、私はプロジェクトでこのフィドルに示されているソリューションを次のように使用しています。

mYiew.get('container').reset();

コンテナがAPIとして使用されることを意図していないことについては、https ://github.com/emberjs/ember.js/commit/5becdc4467573f80a5c5dbb51d97c6b9239714a8で説明されていますが、他のユースケースのビュー。

また、ビューのコンテナには直接( ".container"で)アクセスできます。つまり、開発者は、アプリケーションの ".__container__"のように到達するのを「難しく」していません。これは、彼らがそれをどのように使用することを意図しているかについて何かを示唆しているかもしれません。

必要なときにいつでもキャッシュをクリアできるビューは、私には不合理または悪い習慣ではないように思われるので、少なくとも誰かが私をより良いアイデアでまっすぐに設定するまで、上記のソリューションを使用しています(またはキャッシュAPI)。

于 2013-03-27T23:55:04.240 に答える