Ember ViewState替代方案

时间:2013-04-30 11:54:15

标签: ember.js


  已弃用的Ember.ViewState的替代方法是什么?我尝试使用Ember.State而不是ContainerView等,但无法加载视图。如果有人可以提供帮助(最好有任何例子),那就太棒了。

(无法分享整个代码,因为它正在进行中)

newState: Ember.State.create({
        ...
        view: Ember.ContainerView.create({
            childViews: [ Dashboard.ChartView.create() ]
        }),
});

此外,如何调试视图未呈现的原因,特别是如果您想知道您的布局和插座是否存在问题?出口是否与StateManager一起使用?现在,假设我的index.html中只有以下内容,是否足够(我使用的是Ember AnimatedOutlet)?

<script type="text/x-handlebars" data-template-name="application">
    {{animatedOutlet name="main"}}
</script>

使用新的Ember规范,如何在不使用路由的情况下使用带有StateManager的插座?我想要一个只有默认“/”路线的单页应用程序?

谢谢,
稻谷

1 个答案:

答案 0 :(得分:0)

对于这类问题,我通常会从现在单独的Ember.StateManager项目中创建ember-states。然后我在我的控制器上计算了属性,确定是否应该显示页面的各个部分。然后,在我的模板中,我使用仅在{{#if shouldShowPartX}} ... {{\if}}处于给定状态时才显示的StateManager类型语句。这是一个更完整的例子:

  App.MyController = Ember.Controller.extend({
    isOpen: Ember.computed.equal('panelManager.currentState.name', 'open')
    init: function() {
      this._super();
      # Create the state manager instance from the class defined on this controller.
      this.set('panelManager', this.PanelManager.create());
    },
    reset: (function() {
      this.get('panelManager').send('reset');
    }).on('init'),
    PanelManager: Ember.StateManager.extend({
      initialState: 'open',
      open: Ember.State.create({
        # If already open do nothing.
        open: function(manager) {},
        # Close the panel
        shrink: function(manager) {
          manager.transitionTo('closed');
        },
      }),
      closed: Ember.State.create({
        # If already closed, do nothing
        shrink: function() {},
        # Open the panel
        open: function(manager) {
          manager.transitionTo('open');
        },
      }),
      reset: function(manager) {
        manager.transitionTo(manager.get('initialState'));
      }
    })
  });

然后在我看来,我可以这样做:

{{#if isOpen}}
  <div class="panel panel-open"> ... </div>
{{else}}
  <div class="panel panel-closed"> ... </div>
{{/if}}

这是一个公认的简单示例,人们通常不会将StateManager用于简单的两态情况,但更复杂的例子可能会令人困惑。

这会有帮助吗?它不需要直接使用ContainerView进行混乱,而是依赖于处理ContainerView块的隐式{{#if}},并根据StateManager的状态创建视图。 / p>