2

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

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

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

所以我想做的是在导航到someResources.someResource基于result.

我确实有一个名为的模型App.SomeResource和一个 find 方法,如果我直接进入该页面,它就可以工作。

4

2 回答 2

2

因为问题是我希望在进行转换时完全重新加载模型,linkTo因为这是使用给它的模型,所以它不起作用。该问题的解决方案其实很简单,只需使用常规的 html a-tag 即可。我最终做的是:

<a {{bindAttr href="somePropertyInYourModel"}}>{{someTextProperty}}</a>

该属性somePropertyInYourModel是一个包含指向新页面的 url 的属性。如果 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,如果顺序改变了,最终的url也应该改变。

于 2013-07-11T06:25:37.600 回答
2

如您所见,Ember 将在使用时绕过model()钩子。linkTo假设您将模型传递给它,因此它将使用 that( result) 作为model.

您可以使用的下一个钩子是setupController. 由于您有一个model适用于直接路由的钩子,因此您可以直接从此处调用它。

一个警告是,您还需要允许模型已经加载的直接路径加载。

setupController: function(controller, model) {
  if (!model.isModel) {
    this.model().then(function(result)) {
      controller.set('model', result)
    }
  }
}

model.isModel是否通过直接加载模型上的 isModel 属性进行此检查,当使用linkTo.

注意:上面的代码假定您Promisemodel()钩子中返回 a 。

于 2013-07-10T11:07:36.903 回答