我有一个自定义视图来显示页面上当前模型导航的面包屑,下面是它在我的模板中的外观(这是奇异的模型模板):
<div class="breadcrumbs">
{{view Mdm.BreadcrumbView}}
</div>
以下是我的视图用于渲染面包屑的内容:
App.BreadcrumbView = Ember.View.extend
templateName: 'breadcrumb'
penultimate: (->
content = @get('controller.content.self_and_ancestors')
content[content.length - 2]
).property('controller.content')
last: (->
content = @get('controller.content.self_and_ancestors')
content[content.length - 1]
).property('controller.content')
这是呈现数据的面包屑模板:
<ul class="breadcrumb">
{{#if view.penultimate}}
<li>{{#linkTo group view.penultimate}}Back{{/linkTo}}</li>
{{/if}}
<li>{{view.last.name}}</li>
</ul>
视图正在使用的模型(controller.content
)具有嵌套数据self_and_ancestors
,其中包含我所在的当前页面所需的面包屑数据。我只对看到该数组中的last
对象以及它前面的那个对象感兴趣(这是penultimate
和last
正在显示的内容)。面包屑渲染完美,我可以正常导航,直到我点击“返回”(penultimate
)链接。当我点击时,我收到以下错误:
Uncaught TypeError: Cannot read property 'length' of undefined
由于某种原因,内容未定义,但我不确定为什么。有什么想法吗?
Welp,这是一个例子http://jsbin.com/ejazin/2。然而,它正在这个例子中工作,这使我成为其他可能是问题的东西。基本上每次单击我的应用程序中的痕迹导航链接时,路由器会根据ID执行find
,该ID进行ajax调用以查找该路由和所有子组的当前组。也许该视图试图在从服务器返回之前提取sub_groups
数据...有没有办法检查/阻止它?
这可能会传达我正在努力做的事情 - http://jsbin.com/obazus/1/。
好的,问题肯定是视图在ajax请求在模型中完成之前呈现并调用penultimate
。话虽如此 - 在模型的ajax请求完成后,确保它呈现的最佳方法是什么?
答案 0 :(得分:1)
在仔细查看您的用例之后,可以查看新的路由器整容 here。它仍然没有大量文档记录,很快就会作为博客文章出现在ember网站上,但它已经合并到ember-latest中,因此您可以访问新的实现。特别是beforeModel
&amp; afterModel
钩子的接缝与你相关。
例如,在afterModel
挂钩中,您可以执行以下操作:
App.PostsIndexRoute = Ember.Route.extend({
afterModel: function(posts, transition) {
if (posts.length === 1) {
this.transitionTo('post.show', posts[0]);
}
}
});
希望它有所帮助。