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

Ember.js 使用Emberjs中的不同模型从一条路线过渡到另一条路线,ember.js,handlebars.js,Ember.js,Handlebars.js,我有一个搜索页面,在那里我们可以得到不同类型的搜索结果。在我想使用的搜索结果列表中 {{#linkTo 'someResources.someResource' result}}{{result.Name}}{{/linkTo}} 在路线someResources.someResource上,我想使用与搜索页面完全不同的模式。我该怎么做?当我点击linkTo的链接时,它不会再次加载模型,而是尝试在此处使用名为result的模型 因此,我希望在导航到someResources.someResou

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

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

因此,我希望在导航到
someResources.someResource
时,根据
result
中的值重新加载模型


我确实有一个名为App.SomeResource的模型,如果我直接进入该页面,它的查找方法就会起作用。

Ember在使用
linkTo
时会绕过
model()
钩子。假设您向它传递了一个模型,因此它将使用(
结果
)作为
模型

您可以使用的下一个钩子是
setupController
。由于您有一个
模型
钩子可以在直接路由上工作,因此您可以从这里直接使用call

一个警告是,您还需要考虑模型已经加载的直接路由加载

setupController: function(controller, model) {
  if (!model.isModel) {
    this.model().then(function(result)) {
      controller.set('model', result)
    }
  }
}
model.isModel
是通过直接加载的模型上的isModel属性进行的检查,当使用
linkTo
传递时,该属性应不存在


注意:上面的代码假设您在
model()
钩子中返回了
Promise

Ember将在使用
linkTo
时绕过
model()
钩子。假设您向它传递了一个模型,因此它将使用(
结果
)作为
模型

您可以使用的下一个钩子是
setupController
。由于您有一个
模型
钩子可以在直接路由上工作,因此您可以从这里直接使用call

一个警告是,您还需要考虑模型已经加载的直接路由加载

setupController: function(controller, model) {
  if (!model.isModel) {
    this.model().then(function(result)) {
      controller.set('model', result)
    }
  }
}
model.isModel
是通过直接加载的模型上的isModel属性进行的检查,当使用
linkTo
传递时,该属性应不存在


注意:上面的代码假设您在
model()
hook中返回了
Promise

因为问题是,在使用
linkTo
进行转换时,我希望完全重新加载模型,因为这使用的是给定的模型。这个问题的解决方法其实很简单,只需使用一个普通的html
a
-标记即可。我最后做的是:

<a {{bindAttr href="somePropertyInYourModel"}}>{{someTextProperty}}</a>
鉴于我已设置了以下路线:

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中改变。

因为问题是,在使用
linkTo
进行转换时,我希望完全重新加载模型,但这不起作用,因为它使用的是给定的模型。这个问题的解决方法其实很简单,只需使用一个普通的html
a
-标记即可。我最后做的是:

<a {{bindAttr href="somePropertyInYourModel"}}>{{someTextProperty}}</a>
鉴于我已设置了以下路线:

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中改变。

我意识到有一个更简单的解决方案,不要使用
链接到
:)。相反,我可以只使用一个常规的
a
-标记,并将
href
绑定到模型的一个属性,这更简单、更清晰。可能适用于非嵌套资源
linkTo
还提供了
LinkView
为活动路由设置css类。它对嵌套资源工作良好。使用一个普通的a标签可以加载模型,就像页面刷新一样,这正是我想要的。这正是我需要的。谢谢分享。我意识到这个问题有一个更简单的解决方案,不要使用
linkTo
:)。相反,我可以只使用一个常规的
a
-标记,并将
href
绑定到模型的一个属性,这更简单、更清晰。可能适用于非嵌套资源
linkTo
还提供了
LinkView
为活动路由设置css类。它对嵌套资源工作良好。使用一个普通的a标签可以加载模型,就像页面刷新一样,这正是我想要的。这正是我需要的。谢谢分享。有趣的解决方案,应该会在某个时候派上用场。尽管有人可能会争辩说,在一个页面应用程序中重新加载整个页面以重新加载单个模型是一种过分的做法。:)但您并不是在重新加载整个页面,这就是重点:)。如果链接位于页面的ember上下文中,且目标位于ember应用程序中,则只会重新加载模型,而不会传递到路由。因此,页面不会仅重新加载模型。这就像
转换到
链接到
,但您让目标解析模型。我现在明白了。URL位置是散列爆炸式的,我错过了,绝对方便。如果没有hash-bang,它是一个常规链接。我在分页混合中使用了类似的结构。可能有用的是,URL可以通过以下Ember方法构建:window.location=this.router.generate('resourceA.routeB',{val1:'foo',val2:'bar'});有趣的解决方案,应该在某个时候派上用场。尽管有人可能会争辩说,在一个页面应用程序中重新加载整个页面以重新加载单个模型是一种过分的做法。:)但您并不是在重新加载整个页面,这就是重点:)。如果链接位于页面的ember上下文中,且目标位于ember应用程序中,则只会重新加载模型,而不会传递到路由。因此,页面不会仅重新加载模型。这就像
转换到
链接