Ember.js 如何对路由器路径动态段进行编码,使模型属性不为';未定义';?

Ember.js 如何对路由器路径动态段进行编码,使模型属性不为';未定义';?,ember.js,ember-cli,broccolijs,Ember.js,Ember Cli,Broccolijs,在一个基于CLI的Ember应用程序中,使用CLI api存根提供静态测试JSON,我有一个Routesearch操作,它在controller.model上获取和设置酒店预订JSON数据。视图循环使用{{{model itemController=“reservations/-item”}}中的每个项,保留项通过{{action“modifyReservation”item}}传递给“modifyReservation”操作。然后,此操作将预订传递到This.transition('find-

在一个基于CLI的Ember应用程序中,使用CLI api存根提供静态测试JSON,我有一个Route
search
操作,它在
controller.model
上获取和设置酒店预订JSON数据。视图循环使用
{{{model itemController=“reservations/-item”}}
中的每个项,保留项通过
{{action“modifyReservation”item}}
传递给“modifyReservation”操作。然后,此操作将预订传递到
This.transition('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\u Value'])
来控制ID,但是用
(reservation.ResGlobalInfo.HotelReservationIDs.HotelReservationID.firstObject.@ResID\u Value)
我得到一个西兰花构建错误。它似乎不喜欢
@
。当然,使用此访问器/路径作为动态段路径,我也会得到未定义的
。我尝试了一些语法变体,但都不起作用


如何对路由器路径动态段进行编码,使其从传递给路由的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 ???
  }
)};

但是你的问题让我感觉很。。。。。联合国会员国。这感觉不优雅,余烬非常优雅

谢谢你的建议。该应用程序基于大约一年前的EAK惯例,在升级和迁移过程中,我一直在修改一些不推荐的做法

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

在切换到仅将ID传递到“Transitiono”之后,我发现目标路由/控制器/视图没有所需的模型数据。如果我查找目标路由并设置它的模型(使用我的保留对象),那么当我转换到它时,我会从路由反序列化钩子中得到“this.model不是函数”(因为此操作期望该对象被序列化,在本例中不是,我不知道如何以那种方式传递它)。在尝试了几个小时我能找到或想到的语法的每一种变体之后,我想出了一个解决方案,在目标路由中添加了一个“proxyModel”属性,我在原始路由中查找并设置了该属性。然后在目的地路由模型钩子中,我返回'this.proxyModel'。这样,目的地路由和控制器就有了所需的模型数据,路由器动态段中“未定义”ID的问题就消失了。因此,此解决方案适用于“查找预订”和“查找预订”路线,对“新书”路线没有负面影响,所有路线都转换为“摘要”视图(但通过不同的路线和控制器)


我们还没有将api存根测试json(现在的cli api存根)转移到真正的webservice和REST api,因此不知道在这样做时,我们需要在多大程度上重新处理模型。此应用程序完成时,Ember Data处于测试阶段,但我相信,当我们切换到真正的数据服务时,我们会考虑利用它。

该代码是由第三方Ember专家开发的。我只是在处理我们所拥有的,并将其迁移到Ember CLI,因为我们不再与他们打交道了。Transitiono调用传递整个对象,因为FindBookingSummaryRoute setupController需要向其传递整个模型对象。路由器只是想在一路上把ID作为一个动态段来提取。这个路由有几个入口路径,所以我不确定如果我添加一个“model”钩子以转到并按ID获取保留,会发生什么。我假设在“setupController”中,我可以添加逻辑,如果model对象只包含一个保留ID,则按ID进行查找,否则使用普通对象。或者在路由“modifyReservation”操作中,我可能能够在转换到目标控制器模型之前在目标控制器模型上设置数据对象。听起来您正在处理一些非常旧的余烬。现在越来越少使用像
setupController
这样的旧约定,因为余烬数据或类似的持久性库使得请求记录变得非常容易,如果记录尚未持久化,则可以从存储区或服务器获取记录。我的一个应用程序中的公共模型钩子看起来像
返回this.store.find('summary',params.reservation\u id),Ember Data决定如何使用它。简言之,鉴于其他一些非常疯狂的事情正在发生,我的答案可能不是最适合你的:-)很高兴听到它现在起作用,但我真的很担心,你只是在以不该使用的方式使用Ember来增加技术债务。我知道您继承了代码,但我真的想看看新的文档并重新编写一些旧的结构。我保证你不会后悔:-)好吧,但是“余烬数据”仍然是测试版,我不知道为什么我需要在我刚刚将数据对象传递到我的操作中时按ID查找数据对象-尽管如果我要将URL标记为书签并返回,我希望它应该会得到它。但正如我所说,这些项目尚未完成,我只是让它们进入一个状态,我们可以用真正的数据服务建立它们,并继续按照社区建议的做法走上正轨。稍后我将重新讨论此解决方法/黑客攻击,但现在有大约100个不推荐使用的警告需要处理,而且