嵌套路由从链接触发,而不是从URL更改

时间:2013-02-11 21:32:48

标签: routes ember.js

我正在开发一个基本的ember.js应用程序,并且对某些行为感到困惑。我有一些看起来像这样的路线:

this.resource('campaigns', { path: '/campaigns'}, function() {

    this.route('new', { path: '/new' });
    this.route('campaign', { path: '/:campaign_id' });

});

App.CampaignsIndexRoute = Ember.Route.extend({

model: function() {

    App.Keyword.find();
    return App.Campaign.find();

},

renderTemplate: function(controller, model) {

    this.render({outlet: 'page'});

}

});

App.CampaignsCampaignRoute = Ember.Route.extend({

model: function(params) {
    alert("Model Firing");
    console.log(params.campaign_id);
    return App.Campaign.find(params.campaign_id);
},
renderTemplate: function(controller, model) {
    this.render({outlet: 'page'});
    alert("Template Firing");
}

});

......以及一个看起来像这样的视图:

App.CampaignsCampaignView = Em.View.extend({

templateName: 'templates/campaigns/campaign',

});

...以及一个看起来像这样的主模板:

<!-- ================================================== -->
<!-- =================== APP HEADER =================== -->
<!-- ================================================== -->

{{ view App.HeaderView }}

<!-- ================================================== -->
<!-- ======================= APP ====================== -->
<!-- ================================================== -->

<div id="app" class="">

<!-- ================================================== -->
<!-- ==================== SIDEBAR ===================== -->
<!-- ================================================== -->

<div id="sidebar">

    {{ view App.NavigationView }}

    {{ view App.StarredCampaignsView }}

</div>

<!-- ================================================== -->
<!-- ====================== STAGE ===================== -->
<!-- ================================================== -->

<div id="stage" class="">

    <!-- ================================================== -->
    <!-- ================= STAGE SIDEBAR ================== -->
    <!-- ================================================== -->

        <div id="stage-sidebar" class="">

        {{ view App.StageSidebarView }}

    </div>

    <!-- ================================================== -->
    <!-- ====================== PAGE ====================== -->
    <!-- ================================================== -->

    <div id="page" class="">

        {{ outlet page }}

    </div>

</div>

</div>

正如您所看到的,在CampaignsCampaign路线中有两个非常简单的提醒,只是为了让我知道正在激活的内容。

因此,/#/ campaign返回广告系列列表,/#/ campaign / new返回创建页面和/#/ campaigns /:campaign_id应显示单个广告系列及其详细信息。

这一切都可以从系统内部完美运行。当您从/#/ campaign视图点击广告系列时,它会直接链接到详细视图,并加载所有正确的信息。

问题

如果您只输入类似“http://mysite.com/#/campaigns/ANY_ID点击列表视图中的链接,则会出现问题。页面只会加载空白而且未调用renderTemplate (没有警报)。模型正在加载(获取警报)并且params.campaign_id正在成功传递(可以成功登录到控制台)。

我认为这是一个路由器问题,但我不知道从哪里开始。任何帮助将不胜感激。

谢谢你看看!我可以发布更多信息,让我知道您在评论中需要什么。

1 个答案:

答案 0 :(得分:4)

直接转到某个页面时所遵循的过程与您按照链接略有不同。我没有看到模板中的链接,所以我不是100%确定发生了什么,但一般来说,如果你去链接

{{#linkTo myRoute myVar}} A Link {{/linkTo}}

路由不运行model函数,您只需以myVar作为模型开始(但您仍然执行setupController函数)。

因此,要使硬链接起作用,您需要一个model函数来收集链接变量传递的信息。