对象未从Ionic服务正确返回

Object not getting returned properly from Ionic service

本文关键字:返回 服务 Ionic 对象      更新时间:2023-09-26

背景:我正在做一个关于纽约地铁的简单Ionic项目。我使用的是Ionic"选项卡"模板,我有一个选项卡,列出了所有路线及其符号(1、2、3、a、C、E等),用户应该能够点击其中列出的任何路线,并进入详细信息页面(有点像启动新的Ionic项目时,选项卡模板中的"聊天/聊天详细信息"设置)。

问题是我似乎无法获得"路线详细信息"页面来加载有关所选路线的信息。像{{route.name}}{{route.desc}}这样的表达式都是空白的。

routes.json文件(示例,在www/js/routes.json下归档):

{
  "routes": [{
    "id": "1",
    "name": "1",
    "desc": "7 Avenue Local",
    "className": "c123"
  },
  {
    "id": "2",
    "name": "2",
    "desc": "7 Avenue Express",
    "className": "c123"
  },
  {
    "id": "3",
    "name": "3",
    "desc": "7 Avenue Express",
    "className": "c123"
  },
...

app.js:

angular.module('starter', ['ionic', 'starter.controllers', 'starter.services'])
// ...
.state("tab.routes", {
  url: "/routes",
  views: {
    "tab-routes": {
      templateUrl: "templates/tab-routes.html",
      controller: "RoutesCtrl"
    }
  }
})
  .state("tab.route-detail", {
    url: "/routes/:id",
    views: {
      "tab-routes": {
        templateUrl: "templates/route-detail.html",
        controller: "RouteDetailCtrl"
      }
    }
  });

controllers.js:

angular.module('starter.controllers', [])
// ...
/* This one works perfectly */
.controller('RoutesCtrl', function($scope, $http) {
  $http.get("js/routes.json").then(function(response) {
    $scope.routes = response.data.routes;
    console.log($scope.routes);
  });
})
/* This one does NOT work */
/* $stateParams.id returns the correct value, but $scope.route
        does not store the Route returned from the service (null) */
.controller("RouteDetailCtrl", function($scope, $stateParams, Routes) {
  $scope.route = Routes.getRoute($stateParams.id);
})

services.js:

angular.module('starter.services', [])
/* This is the problem */
.factory("Routes", function($http) {
  return {
    getRoute: function(id) {
      return $http.get("js/routes.json").then(function(response) {
        var routes = response.data.routes;
        for(var i = 0; i < routes.length; i++) {
          if(parseInt(id) === parseInt(routes[i].id)) {
            return routes[i];
          }
        }
        return null;
      })
    }
  }
})

我认为这个问题与JSON在services.js中返回的方式有关——是我的JSON存储方式,还是我在接收端"解析"它的方式?"RoutesCtrl"工作得很好,但无论我在services.js中使用response的什么变体,我似乎都无法获得路线细节——我尝试过responseresponse.dataresponse.data.routes,但都不起作用。

route-detail.html:(如您所见,{{route.whatst}}引用了controllers.js中的$scope.route,但它没有被存储)。

<ion-view view-title="{{route.name}}">
    <ion-content class="padding">
        <h2>{{route.name}}</h2>
        <h2>{{route.desc}}</h2>
        <p>This is the detail page.</p>
    </ion-content>
</ion-view>

问题不在于routes对象,因为相同的代码在RoutesCtrl中运行良好,而在于您在RouteDetailCtrl中处理响应的方式。Route服务返回的响应不是原始javascript值,而是promise,您需要正确处理promise才能得到响应:

.controller("RouteDetailCtrl", function($scope, $stateParams, Routes) {
   Routes.getRoute($stateParams.id)
     .then(function (response) {
        $scope.route = response;
     });
})