【问题标题】:Angularjs - read inside json fileAngularjs - 读取内部 json 文件
【发布时间】:2015-12-21 11:02:32
【问题描述】:

这是我第一次尝试使用 angularjs 和 ionic-framework。

我有一个示例 json 文件,我想在屏幕上显示其中的一些数据。 显示数据位有效,但我想用一些信息填充一个“详细信息”页面,这些信息存储在主 json 文件中,我需要使用 url 中的 id 来选择仅显示我需要的数据。

这里有一些代码:

App.js

angular.module('hgapp', ['ionic', 'hgapp.controllers', 'ngResource'])

.config(function ($stateProvider, $urlRouterProvider) {
    $stateProvider
        .state('app', {
            url: '/app',
            abstract: true,
            templateUrl: 'templates/menu.html',
            controller: 'AppCtrl'
        })
        .state('app.details', {
            url: '/details/:roomID',
            views: {
                'menuContent': {
                    templateUrl: 'templates/details.html',
                    controller: 'DetailsCtrl'
                }
            }
        })
    $urlRouterProvider.otherwise('/app/home');
});

Controllers.js

angular.module('hgapp.controllers', ['hgapp.services'])

.controller('AppCtrl', function ($scope, HGJson) {
    HGJson.get(function (data) {
        $scope.rooms = data.data;
    })
})

.controller('DetailsCtrl', function ($scope, $stateParams, HGJson) {
    $scope.roomID = $stateParams.roomID;
    console.log($stateParams.roomID);
})

services.js

angular.module('hgapp.services', ['ngResource'])
.factory('HGJson', function ($resource) {
    return $resource('json/data.json')
});

Data.json(只是一个简化的例子)

{
   tm: 00000000,
   errors: 0,
   data: {
       {id: 0, name: Value 0, url:url-0},
       {id: 1, name: Value 1, url:url-1},
       {id: 2, name: Value 2, url:url-2}
}

details.html

<ion-view view-title="Details">
<ion-content>
    <h1>{{roomID}}</h1>
</ion-content>

在详细信息页面中,我打印 roomID 只是为了查看控制器 (detailsCtrl) 是否工作,并且每次都打印正确的 id。现在,我遇到的问题是如何处理来自 HGJson 服务的数据,以便我可以打印来自正确房间 ID 的数据。

我希望这个问题足够清楚,如果没有,请随时要求更多澄清。

非常感谢

编辑

最后我解决了这个问题,将它添加到我的 controller.js 文件中:

.controller('DetailsCtrl', function ($scope, $stateParams, HGJson) {
    HGJson.get(function (data) {
        angular.forEach(data.data, function (item) {
            if (item.id == $stateParams.roomID)
                $scope.currentRoom = item;
        });
    });
})

【问题讨论】:

  • 您尝试过json 过滤器吗?在您的 html 中:{{roomID | json}}
  • 添加 json 过滤器的结果是这个 -> “6”(对于 roomID = 6)。没有别的,它只是添加了语音标记
  • 如果您尝试{{rooms | json}} 会发生什么。你看到 data.json 中的数据了吗?
  • 是的,有 {{rooms | json }} 我可以看到所有房间的数据,而不仅仅是我想要的房间(id:6)
  • 好的,我会添加一个答案,给我几分钟 :)

标签: angularjs json ionic-framework ionic


【解决方案1】:

只需执行与您在应用控制器中所做的相同的操作,但在返回的 JSON 中找到您想要的房间:

HGJson.get(function (data) {
    $scope.room = data.data.filter(function(room) {
      return room.id == $stateParams.roomID);
    })[0];
});

您还可以将过滤功能放在您的服务中,以便将来当您拥有真正的动态后端时,您可以调用不同的 URL 仅返回请求的房间,而不是调用返回所有房间的 URL。

angular.module('hgapp.services')
.factory('HGJson', function ($http) {
    return {
      getRooms: function() {
        return $http.get('json/data.json').then(function(response) {
          return response.data;
        });
      },
      getRoom: function(roomId) {
        return $http.get('json/data.json').then(function(response) {
          return response.data.data.filter(function(room) {
            return room.id == roomID;
          })[0];
        });
      }
    };
});

请注意,您的 JSON 无效:数据必须是数组,而不是对象。

【讨论】:

  • 1) 感谢关于 json 的建议,它实际上只在这些问题中是错误的,但在我的开发机器上却没有 2) 你能提供一个在服务上添加过滤的例子吗?或者我可以阅读更多关于它的东西?谢谢
  • 我无法使用您的代码,它会在控制台中产生大量错误,我无法再检索任何数据
  • 接缝好像 getRoom(roomId) 有问题
  • 现在应该修复了。但是你不应该使用我的代码。在你理解之前不会。
【解决方案2】:

在您的控制器中,您需要创建一个函数来“查找”数据对象中的正确对象。

试试这样的:

$scope.getRoom = function(id) {
  for(var i in $scope.rooms) {
    if($scope.rooms[i].id === id) {
      return $scope.rooms[i];
    }
  }
};

你可以在你的 DOM 中显示它:

{{ getRoom(roomID) }}

但是将当前房间设置为范围变量可能会更好,而不是每次都运行该函数。所以在这种情况下(我强烈推荐),你可以设置angular.copy($scope.rooms[i], $scope.currentRoom)(这会将房间复制到currentRoom范围变量中)而不是返回$scope.rooms[i],然后在DOM 只需 {{ currentRoom }}

祝你好运!

【讨论】:

  • 我假设getRoom函数需要进入detailsCtrl,对吧?
  • 但是,就像我的建议一样,我会在数据加载时找到房间,并将其设置为 currentRoom,因此您并不总是计算 getRooms
  • 我像你说的那样尝试过,但我有一个空白页...按照你的建议使用 currentRoom Scope 尝试什么都没有返回(甚至添加 json)
  • 抱歉,它应该在 appCtrl 中,因为那是 $scope.rooms 所在的地方
  • 但是它在我的模板中不可用,因为它是由 detailsCtrl 控制的,对吗?
猜你喜欢
  • 2016-09-17
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2021-06-03
  • 2014-10-15
相关资源
最近更新 更多