Ember.js 余烬JS深度链接

Ember.js 余烬JS深度链接,ember.js,deep-linking,Ember.js,Deep Linking,我有一个Ember JS 1.5.1应用程序,带有Ember data 1.0.8测试版。有两个简单的编译模板,相关部分包括: 指数 当我导航到localhost时,我得到的是屏幕左侧的三个角色的简单列表,而右侧没有。(如预期) 然后,当我选择一个链接(如“分析”)时,右侧的出口将填充两个活动名称“talking”和“doing”的预期列表 到目前为止还不错 我注意到,当我将鼠标悬停在“分析”链接上时,浏览器会按预期显示下面的url localhost:/#/Analysis 然而,当我直接将

我有一个Ember JS 1.5.1应用程序,带有Ember data 1.0.8测试版。有两个简单的编译模板,相关部分包括:

指数 当我导航到localhost时,我得到的是屏幕左侧的三个角色的简单列表,而右侧没有。(如预期)

然后,当我选择一个链接(如“分析”)时,右侧的出口将填充两个活动名称“talking”和“doing”的预期列表

到目前为止还不错

我注意到,当我将鼠标悬停在“分析”链接上时,浏览器会按预期显示下面的url

localhost:/#/Analysis
然而,当我直接将这个url剪切并粘贴到浏览器地址栏时,我只得到左侧的链接列表,而在主窗口中没有任何内容。“说话”和“做”的列表不会出现。浏览器中没有显示错误,ember不会引发异常


当您直接进行深度链接而不必一直从根目录导航时,如何使这个简单的嵌套路由刷新所有内容?

当您使用
链接到
并将其传递给模型时,它将跳过将模型从
链接到
提供给路由的模型挂钩。如果您刷新页面,它将点击树下的每个路由,直到获取满足请求所需的每个资源/路由的模型。因此,如果我们一次看一条路线,它会这样做:

  • 点击应用程序路径,获取其模型(如果存在)(应用程序路径是每个余烬应用程序的根)
  • 点击你的
    索引
    路线,它将返回
    App.Role.find()
  • 点击你的
    activites
    路线,它将返回
    App.Activity.find()
  • 第三点是你真正的问题所在。无论url的这部分是否表示分析、管理或开发,您都将返回
    App.Activity.find()
    。您已经定义了动态slug
    :name
    ,ember将解析url的适当部分,并将该部分作为对象传递,在
    分析的情况下,ember将
    {name:'Analysis'}
    传递到您的模型挂钩。您将希望利用这一点,返回正确的模型

    App.ActivitiesRoute = Ember.Route.extend({
        model: function(params){ 
           var roles = this.modelFor('index');
           return roles.findBy('name', params.name);
        }
    });
    
    此外,您正在使用一个相当旧版本的余烬数据。以下是一个小示例,说明了如何将余烬数据用于较新版本:


    如您所见,您不再申报商店。此外,您可能会遇到被视为异步属性的问题,并且可能希望读取更新为测试版的余烬数据,并将App.Role更改为使用activities:DS.hasMany('activity',{async:true})。包含了您建议的代码,但是当var record=roles.findBy('name',params.name)获取对象时,var result=record.get('activites');返回未定义的。导致零条记录像以前一样被返回(当你进行深度链接时),你能在代码看起来像什么的基础上添加一个更新吗,它会让你在哪里进行GET等更清楚一些。我只是在将它放入jsbin时意识到(我没有完成连接,这是开始,)您正在将整个角色模型传递给活动路由,因此您希望忽略该路由中的
    .get('activites')
    。我正在跑步,但如果我回来后还不能解决问题,我会把它连接好的。你说得对,它很有魅力,谢谢你
    window.App = Ember.Application.create();
    
    App.ApplicationAdapter = DS.FixtureAdapter;
    
    App.Router.map( function(){
        this.resource('index', {path: '/'}, function(){
            this.resource('activities', { path:':name'}, function(){
                this.resource('activity');
            });
        });
    });
    
    App.IndexRoute = Ember.Route.extend({
        model: function(){
            return this.store.find('role');
        }
    });
    
    App.ActivitiesRoute = Ember.Route.extend({
        model: function(params){ 
            var roles = this.modelFor('index');
            return roles.findBy('name', params.name).get('activites');
        }
    });
    
    App.Role = DS.Model.extend({
        name: DS.attr('string'),
        activities: DS.hasMany('activity', {async:true} )
    });
    
    App.Activity = DS.Model.extend({
        name: DS.attr('string')
    });
    
    App.Role.FIXTURES = [{
        id: 1,
        name: 'Management',
        activities: [1]
    },{
        id: 2,
        name: 'Analysis',
        activities: [1,2]
    },{
        id: 3,
        name: 'Development',
        activities: [2]
    }]
    
    App.Activity.FIXTURES = [{
        id: 1,
        name: 'talking'
    },{
        id: 2,
        name: 'doing'
    }];
    
    LHS list         RHS pane
    ==========       ======== 
    Management       talking
    Analysis         doing
    Development
    
    localhost:/#/Analysis
    
    App.ActivitiesRoute = Ember.Route.extend({
        model: function(params){ 
           var roles = this.modelFor('index');
           return roles.findBy('name', params.name);
        }
    });