Angularjs - 在 json 文件中读取
Angularjs - read inside json file
这是我第一次尝试 angularjs 和 ionic-framework。
我有一个示例 json 文件,我想在屏幕上显示其中的一些数据。
显示数据位有效,但我想用一些信息填充 "details" 页面,这些信息作为 abject 存储在主 json 文件中,我需要使用来自 url 到 select 以仅显示我需要的数据。
这是一些代码:
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:
中找到您想要的房间
HGJson.get(function (data) {
$scope.room = data.data.filter(function(room) {
return room.id == $stateParams.roomID);
})[0];
});
您也可以在您的服务中加入过滤功能,这样将来,当您拥有真正的动态后端时,您可以调用不同的 URL,只返回请求的房间,而不是调用 URL 即 returns 所有房间。
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 无效:数据必须是数组,而不是对象。
在您的控制器中,您需要创建一个函数来 "find" 数据对象中的正确对象。
尝试这样的事情:
$scope.getRoom = function(id) {
for(var i in $scope.rooms) {
if($scope.rooms[i].id === id) {
return $scope.rooms[i];
}
}
};
并且您可以在 DOM:
中显示它
{{ getRoom(roomID) }}
但是 每次都将当前房间设置为范围变量而不是 运行 函数可能会更好。所以在这种情况下(我强烈推荐),而不是返回$scope.rooms[i]
,你可以设置angular.copy($scope.rooms[i], $scope.currentRoom)
(这会将房间复制到currentRoom
作用域变量),然后在 DOM 中简单地使用 {{ currentRoom }}
祝你好运!
这是我第一次尝试 angularjs 和 ionic-framework。
我有一个示例 json 文件,我想在屏幕上显示其中的一些数据。 显示数据位有效,但我想用一些信息填充 "details" 页面,这些信息作为 abject 存储在主 json 文件中,我需要使用来自 url 到 select 以仅显示我需要的数据。
这是一些代码:
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:
中找到您想要的房间HGJson.get(function (data) {
$scope.room = data.data.filter(function(room) {
return room.id == $stateParams.roomID);
})[0];
});
您也可以在您的服务中加入过滤功能,这样将来,当您拥有真正的动态后端时,您可以调用不同的 URL,只返回请求的房间,而不是调用 URL 即 returns 所有房间。
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 无效:数据必须是数组,而不是对象。
在您的控制器中,您需要创建一个函数来 "find" 数据对象中的正确对象。
尝试这样的事情:
$scope.getRoom = function(id) {
for(var i in $scope.rooms) {
if($scope.rooms[i].id === id) {
return $scope.rooms[i];
}
}
};
并且您可以在 DOM:
中显示它{{ getRoom(roomID) }}
但是 每次都将当前房间设置为范围变量而不是 运行 函数可能会更好。所以在这种情况下(我强烈推荐),而不是返回$scope.rooms[i]
,你可以设置angular.copy($scope.rooms[i], $scope.currentRoom)
(这会将房间复制到currentRoom
作用域变量),然后在 DOM 中简单地使用 {{ currentRoom }}
祝你好运!