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