过渡后Ember不会渲染

时间:2013-02-10 00:52:36

标签: ember.js rendering ember-data transitions ember-router

我刚刚编写了一个非常简单的Ember应用程序,它构建在Rails应用程序之上,使用Ember Data并显示,创建和保留一个实体类型到服务器。一切都使用最新的工具(Ember v1.0.0-pre.4-134-gaafb5eb)。

然而,我遇到了一个非常奇怪的问题。我的应用程序有两个视图:实体列表(索引)和用于创建新实体的表单。当我直接输入索引时,一切都显示OK。但是当我转到另一个视图然后返回列表时,视图不会再次呈现。哪个可能是问题?

我想这可能是由于我(可能不正确)使用新的Ember路由器造成的。所以我在这里粘贴了一些应用程序的重要部分(从我的角度来看):

路由器:

App.Router.map(function() {
  this.resource('bands', function() {
    this.route('new');
  });
});

App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('bands');
  }
});

App.BandsRoute = Ember.Route.extend({
    model: function() {
        return App.Band.find();
    }
});

App.BandsNewRoute = Ember.Route.extend({
    renderTemplate : function(){
        this.render('bands_new',{
            into:'application'
        });
    }
});

链接回列表 - 这不起作用:

App.BandsNewController = Em.ArrayController.extend({
    cancel: function() {
        this.transitionTo('bands');
    }
});

在这里查看整个应用:https://github.com/pavelsmolka/roommating
(它受到了很棒的https://github.com/dgeb/ember_data_example

的启发

我不相信,但它可能是Ember本身的错误吗?

1 个答案:

答案 0 :(得分:4)

我认为你的BandsNewRoute中的“渲染”调用搞乱了。试着用Ember默认值来做更多事情。所以我会重构你的应用程序来做到这一点:

(工作小提琴:http://jsfiddle.net/andremalan/DVbUY/

您需要做的就是创建一个“乐队”模板(除了{{outlet}}(如果需要),它可以完全为空)和“bands.index”模板。

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


<script type="text/x-handlebars" data-template-name="bands/index">
    <h2>Bands Index</h2>
    {{#linkTo bands.new}}New Band{{/linkTo}}
</script>

<script type="text/x-handlebars" data-template-name="bands">
    <h1>Bands</h1>
    <p>
      {{#linkTo index}}Start Again{{/linkTo}}
      {{#linkTo bands.new}}New Band{{/linkTo}}
    </p>
    {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="bands/new">
    I'm in new band!
    <a {{action "cancel"}}>Cancel</a>
</script>

你的路线也很好地用这种方式清理:

App.Router.map(function() {
    this.resource('bands', function() {
        this.route('new');
    });
});

App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('bands');
  }
});


App.BandsNewController = Ember.Controller.extend({
    cancel: function() {
        this.transitionTo('bands');
    }
});

我希望有所帮助!