我有一个搜索页面,我们可以获得不同类型的搜索结果。在搜索结果列表中,我想使用
{{#linkTo 'someResources.someResource' result}}{{result.Name}}{{/linkTo}}
在路线someResources.someResource
上,我想使用与搜索页面完全不同的模型。我怎么做?当我点击linkTo
的链接时,它不会再次加载模型,而是尝试在此处使用名为result
的模型。
所以我想根据someResources.someResource
中的值导航到result
时重新加载模型。
我确实有一个名为App.SomeResource
的模型,以及一个直接找到该页面的查找方法。
答案 0 :(得分:2)
当您发现使用model()
时,Ember将绕过linkTo
挂钩。假设您将模型传递给它,因此它将使用result
作为model
。
您可以使用的下一个钩子是setupController
。由于您有一个model
挂钩适用于直接路由,您可以直接从此处调用它。
需要注意的是,您还需要允许直接路由加载模型已经加载的位置。
setupController: function(controller, model) {
if (!model.isModel) {
this.model().then(function(result)) {
controller.set('model', result)
}
}
}
model.isModel
是通过直接加载的模型上的isModel属性进行的检查,当与linkTo
一起传递时,该属性应该不存在。
注意:上面的代码假设您在Promise
挂钩中返回model()
。
答案 1 :(得分:2)
由于问题是我希望在使用linkTo
进行转换时完全重新加载模型,因为它使用的是给定的模型。该问题的解决方案实际上非常简单,只需使用常规的html a
- 标记。我最终做的是:
<a {{bindAttr href="somePropertyInYourModel"}}>{{someTextProperty}}</a>
属性somePropertyInYourModel
是包含新页面网址的属性。如果url位于ember路径中,那么就好像你在地址栏中键入该地址并按Enter键,但没有完全重新加载页面。
我认为这可以在ember中得到改进,如果我可以编写类似的东西会更好:
{{#linkToRoute "resourceA.routeB" params="val1,val2,val3"}}Go here{{/linkToRoute}}
鉴于我已设置此路线:
App.Router.map(function() {
this.resource("resourceA", {{path: "/resourceA"}}, function() {
this.route("routeB", {{path: "/:prop1/:prop2/:prop3");
}
});
我想得到:
<a href="#/resourceA/val1/val2/val3">Go here</a>
val1,val2,val3
的顺序很重要,如果订单被更改,也应在最终网址中更改。