如何对路由器路径动态段进行编码,使模型属性不是 'undefined'?

How to code Router path dynamic segment so Model attribute is not 'undefined'?

在基于 CLI 的 Ember 应用程序中,使用 cli-api-stub 提供静态测试 JSON,我有一个 Route search 操作获取和在 controller.model 上设置酒店预订 JSON 数据。视图使用 {{#each item in model itemController="reservations/-item"}} 循环项目,预订项目通过 {{action "modifyReservation" item}} 传递给 'modifyReservation' 操作。此操作然后将预订传递给 this.transitionTo('find-booking.summary', reservation),其中预订 ID 应显示为动态段,但我得到 undefined (../find-booking/undefined).

JSON:

"ResGlobalInfo": {
  "HotelReservationIDs": {
    "HotelReservationID": [
      {
        "@ResID_Value": "HG34A2"

在../app/router.js:

this.route('summary', {path: "/:ResGlobalInfo.HotelReservationIDs.HotelReservationID.firstObject.@ResID_Value"}, function(){

在操作函数中,我可以使用 (reservation.ResGlobalInfo.HotelReservationIDs.HotelReservationID[0]['@ResID_Value']) 来控制 ID,但是使用 (reservation.ResGlobalInfo.HotelReservationIDs.HotelReservationID.firstObject.@ResID_Value) 我得到了西兰花构建错误。它似乎不喜欢@。当然,将此 accessor/path 作为动态段路径,我也会得到 undefined。我尝试了一些语法变体,其中 none 有效。

我如何编写我的路由器路径动态段,以便它从传递给路由的 JSON 对象中提取预留 ID 'attrib'?

路由的路径定义不应该有对应于您的 JSON 的路径。你应该使用类似的东西:

this.route('summary', {path: "/:reservation_id" });

然后在您路线的模型挂钩中:

import Ember from 'ember';

export default Ember.Route.extend({
  model: function(params, transition) {
    // Your code to return the model
    // Sounds something like the following:
    var data = this.controllerFor('search').get('model').findBy('crazy_path', params.reservation_id);
    return ???
  }
)};

但是你的问题感觉很..... un-Ember-y。这样感觉不优雅,而Ember就很优雅了。

感谢您的建议。该应用程序基于大约一年前的 EAK 约定,在升级和迁移时,我一直在修改一些已弃用的做法。

关于我的 transitionTo 和 setupController 问题,似乎试图从动态段中的 model/obect 访问 ID 的开发人员一定是在试验,因为我认为这不受支持。虽然我找不到优雅的解决方案,但您提到的模型挂钩为我指明了解决方法。

在切换到仅将 ID 传递到 'transitionTo' 之后,我遇到了目标 route/controller/view 没有他们需要的模型数据的问题。如果我查找目标路由并设置它的模型(使用我的预订对象),那么当我转换到它时,我从路由反序列化挂钩中得到 'this.model is not a function' (因为这个操作期望对象被序列化,但它不是在这种情况下,我不知道如何以这种方式传递它)。在尝试了我能找到或想到的语法的每个变体数小时后,我想出了一个解决方法,我在目标路由中添加了一个 'proxyModel' 属性,我在源路由中查找并设置了它.然后在目标路由模型钩子中,我return'this.proxyModel'。有了这个,目标路由和控制器就有了他们需要的模型数据,路由器动态段中 'undefined' ID 的问题就消失了。因此,此解决方法适用于 'find-booking' 和 'lookup-booking' 路线,并且对 'new-book' 路线没有负面影响,所有这些都过渡到 'summary' 视图(但通过不同的路线和控制器)。

我们还没有完成 api-stub 测试 json(现在是 cli-api-stub)到真正的网络服务和 REST API 所以不要不知道当我们这样做时我们将不得不在多大程度上返工模型处理。 Ember 完成此应用程序时数据处于测试阶段,但我相信当我们切换到真正的数据服务时我们会考虑利用它。