1

現在のアプリケーションを 0.9.8 から 1.0pre に更新している最中で、よく理解できないことを実験しています。

私のテンプレートの 1 つに、プロパティにバインドされたコンテナー ビューがあります。

...
{{view Ember.ContainerView currentViewBinding="oTabPanelFrame"}}
...

そして、次のようなコードを実行してコンテナーのビューを変更しました (コードはオブザーバーによって実行されます)。

...
if (sender[key])
    this.set('oTabPanelFrame', sender.get('oFrameView'));
...

1.0pre 以降、これは 1 回だけ機能し、2 回目にビューを設定しようとすると、その状態が「破棄」に変わり (0.9.8 では常に「preRender」でした)、その後表示されなくなりました。

だから、これは何が起こるかです:

  1. ユーザーが UI をクリックすると、ビュー A が正しく表示されます。
  2. ユーザーが他の UI 項目をクリックすると、ビュー B も適切に表示されます。
  3. ユーザーが最初の UI 項目をクリックすると、ビュー A が表示されますが、表示されません。ビューのプロパティに飛び込んだ後、その状態が「破棄」に変わったことに気付きました。

これは正常な動作ですか? 1.0pre の変更ログと、ビュー ステートに関連するさまざまな投稿を確認しましたが、同様のものは見当たりません。

前もって感謝します!

PS: コードはここでは関係ないと思います。もっとコードを公開してほしい場合はお知らせください。

4

1 に答える 1

0

正確には 0.9.8 と 1.0-pre の間に何が追加されるのかはわかりませんが、メモリ リークを回避するためにいくつかの作業が行われたと思います。それからあなたが言ったように、containerViewから削除するとビューが破棄されるようです。私が見つけた解決策は、必要なたびにビューを作成することです。これは最適解ではないと思います。childViews特に のプロパティを使用して、もっとうまくやろうと思いますEmber.ContainerView

これはあなたのものに非常に近い実装です:

Test = Ember.Application.create();

Test.TabPanel = Ember.View.extend({
  templateName: 'tabpanel',
  tagName: 'span',

  init: function() {
    this._super();
    this.set('oTabPanelFrame', Ember.View.create());
  },
  click1: function(event) {
    event.context.set('oTabPanelFrame', event.context.get('view1').create());
  },
  click2: function(event) {
    event.context.set('oTabPanelFrame', event.context.get('view2').create());
  },

  view1: Ember.View.extend({
    defaultTemplate: Ember.Handlebars.compile("View1's contents")
  }),

  view2: Ember.View.extend({
    defaultTemplate: Ember.Handlebars.compile("View2's contents")
  }),
});

var oMyPanel = Test.TabPanel.create();
oMyPanel.appendTo('#content');​

アップデート

これは 1.0 バージョンでは機能しないため、これを実装するための推奨される方法は、outlets. ここに、実装方法の良い例があります: emberjs - ルーター インフラストラクチャを使用してアクティブなメニュー項目をマークする方法

ビューを切り替えるときに状態を維持する方法を示すために、フィドルを変更しました。実際、ビューが「接続」されている場合、それらも毎回インスタンス化されます。ただし、状態はコントローラーまたはモデルで永続化する必要があります。

これがフィドルです:http://jsfiddle.net/Sly7/z8ssG/11/

于 2012-08-15T09:53:49.290 に答える