1

ステートマシンがあり、currentViewBindingを使用して新しい状態に入るたびに、新しいcurrentViewBindingを使用してcontainerView全体の一部をスワップアウトしています。

  index: Ember.State.create({
    enter: function(manager) {
      App.get('appController').set('feedView', Ember.View.create({
        templateName: 'dashboard_feed',
        contentBinding: 'App.feedController.content',
        controller: App.get('App.feedController')
      }));
    }
  })

現時点では、これらのビューのレンダリングは非常に遅いです。ビューをメモリに保持し、状態に入るたびに再レンダリングを回避する方法はありますか?

4

2 に答える 2

3

StackOverflowに関する別の質問に対して、実際にこれに対する解決策を提供しましたが、ここでも非常に関連性があります。ビューが再アクティブ化されたときにフラッシュオブジェクトを最初から再レンダリングしないようにする

これがjsFiddleです:http://jsfiddle.net/EE3B8/1

ContainerViewをフラグで拡張して、破棄時にcurrentViewが破棄されないようにします。ビューインスタンスは、破棄されないようにどこかに隠しておく必要があります。

App.ImmortalContainerView = Ember.ContainerView.extend({
    destroyCurrentView: true,

    willDestroy: function() {
        if (!this.destroyCurrentView) { this._currentViewWillChange(); }
        this._super();
    }
});

App.immortalView = Ember.View.create({
    template: Ember.Handlebars.compile(
        'I WILL LIVE FOREVER!'
    )
});

</ p>

于 2012-06-06T04:41:04.177 に答える
1

Ember.ContainerViewを拡張して、次のようにcurrentViewビューを表示/非表示にすることができます。

App.FastContainerView = Ember.ContainerView.extend({
  toggleCurrentViewFast: true,

  _currentViewWillChange: function() {
    var childViews = this.get("childViews"),
        currentView = this.get("currentView");

    if (this.toggleCurrentViewFast && childViews.indexOf(currentView) >= 0) {
      currentView.set("isVisible", false);
    } else {
      this._super();
    }
  },

  _currentViewDidChange: function() {
    var childViews = this.get("childViews"),
        currentView = this.get("currentView");

    if (this.toggleCurrentViewFast && childViews.indexOf(currentView) >= 0) {
      currentView.set("isVisible", true);
    } else {
      this._super();
    }
  }
});
于 2012-06-29T22:33:47.600 に答える