在Emberjs中使用不同的模型从一条路线过渡到另一条路线

时间:2013-07-10 10:53:19

标签: ember.js handlebars.js

我有一个搜索页面,我们可以获得不同类型的搜索结果。在搜索结果列表中,我想使用

{{#linkTo 'someResources.someResource' result}}{{result.Name}}{{/linkTo}}

在路线someResources.someResource上,我想使用与搜索页面完全不同的模型。我怎么做?当我点击linkTo的链接时,它不会再次加载模型,而是尝试在此处使用名为result的模型。

所以我想根据someResources.someResource中的值导航到result时重新加载模型。

我确实有一个名为App.SomeResource的模型,以及一个直接找到该页面的查找方法。

2 个答案:

答案 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的顺序很重要,如果订单被更改,也应在最终网址中更改。