Angular js - 如何从位于我的服务器中的 json 文件中提取部分数据以获取传递参数的详细视图?
Angular js - How to extract partial data from json file located in my server for a detail view passing a parameter?
我是Angular的新手。我想这是一个简单的问题。我有一个 json 文件,其中包含托管在我的服务器中的不同对象。我得到了显示每个对象的列表。现在,当我单击每个列表项(对象)时,我想在详细视图(不同于列表视图)中显示每个项的详细信息。我知道如何使用参数 (id) 重定向到此详细信息视图,但我不知道如何呈现该特定对象的详细信息。
在这里我展示我的代码:
data.json
[
{
"id": "1",
"name": "james",
"age": "20",
"city": "NY"
},
{
"id": "2",
"name": "allan",
"age": "21",
"city": "London"
},
{
"id": "3",
"name": "thomas",
"age": "22",
"city": "Belfast"
}
]
app.js
angular.module("myApp", ["controllers", "services", "directives", "ngRoute"]);
angular.module("myApp").config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl : 'templates/home.html',
controller : 'HomeCtrl'
})
.when('/list', {
templateUrl : 'templates/list.html',
controller : 'ListCtrl'
})
.when('/list/:id', {
templateUrl: 'templates/item.html',
controller: 'ItemCtrl'
})
.otherwise({redirectTo: '/'});
});
controllers.js
...
.controller('ListCtrl',function($scope, MyService) {
$scope.list = {};
MyService.getData()
.then( function(result) {
$scope.list=result.data;
})
.catch( function(error) {
console.log('There is an error.', error);
});
})
.controller('ItemCtrl',function($scope, $routeParams, MyService, $location) {
var id = $scope.id = $routeParams.id;
$scope.item = {};
MyService.getData()
.then( function(result) {
$scope.item=result.data;
if(id) {
return result.data[id]
}
})
.catch( function(error) {
console.log('There is an error.', error);
});
})
service.js
...
.factory('MyService', function($http) {
return { getData: getData };
function getData() {
return $http.get('data.json');
}
})
item.html
<div ng-controller="ItemCtrl">
<p>{{item.name}}</p>
<p>{{item.city}}</p>
</div>
有什么建议吗?
提前致谢!
您可以使用您的服务加载对象列表,并将它们保存在服务内的变量中,这样您就不会每次都调用该服务(以获取 json 文件),除非您需要每次都获取最新数据。
如果您对以下代码有疑问,请检查 plunkr:https://plnkr.co/edit/1k3RhxIWnsdY7rPViRhK?p=preview
在你的服务中你可以做到这一点
...
.factory('MyService', function($http, $q, $filter) {
var itemList = [];
var self = {};
self.getList = getList;
self.getItem = getItem;
return self;
function getList(){
var defer = $q.defer();
$http.get('data.json').then(function(response){
itemList = response.data;
defer.resolve(itemList); // you can do data manipulation here if you need to
},function(error){
defer.reject(error); //you can customize your error
});
return defer.promise;
}
function getItem(itemId){
if(itemList){
var found = $filter('filter')(itemList, {id:itemId}, true);
return found[0]; //the [0] is to get the first item since found is an array
}
}
})
您可以在控制器加载到您的路由之前在列表控制器中加载数据(项目)。确保在控制器中注入 "items"。
angular.module("myApp").config(function($routeProvider) {
$routeProvider
.when('/list', {
templateUrl: 'templates/list.html',
controller: 'ListCtrl',
resolve: {
items: function(MyService){
MyService.getList().then(function(response){
return response
});
}
}
})
.
...Other Routes Here...
.otherwise({redirectTo: '/'});
});
现在您可以在您的物品控制器中执行此操作
.controller('ItemCtrl',function($scope, $routeParams, MyService) {
var id = $routeParams.id;
$scope.item = MyService.getItem(id);
})
我是Angular的新手。我想这是一个简单的问题。我有一个 json 文件,其中包含托管在我的服务器中的不同对象。我得到了显示每个对象的列表。现在,当我单击每个列表项(对象)时,我想在详细视图(不同于列表视图)中显示每个项的详细信息。我知道如何使用参数 (id) 重定向到此详细信息视图,但我不知道如何呈现该特定对象的详细信息。 在这里我展示我的代码:
data.json
[
{
"id": "1",
"name": "james",
"age": "20",
"city": "NY"
},
{
"id": "2",
"name": "allan",
"age": "21",
"city": "London"
},
{
"id": "3",
"name": "thomas",
"age": "22",
"city": "Belfast"
}
]
app.js
angular.module("myApp", ["controllers", "services", "directives", "ngRoute"]);
angular.module("myApp").config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl : 'templates/home.html',
controller : 'HomeCtrl'
})
.when('/list', {
templateUrl : 'templates/list.html',
controller : 'ListCtrl'
})
.when('/list/:id', {
templateUrl: 'templates/item.html',
controller: 'ItemCtrl'
})
.otherwise({redirectTo: '/'});
});
controllers.js
...
.controller('ListCtrl',function($scope, MyService) {
$scope.list = {};
MyService.getData()
.then( function(result) {
$scope.list=result.data;
})
.catch( function(error) {
console.log('There is an error.', error);
});
})
.controller('ItemCtrl',function($scope, $routeParams, MyService, $location) {
var id = $scope.id = $routeParams.id;
$scope.item = {};
MyService.getData()
.then( function(result) {
$scope.item=result.data;
if(id) {
return result.data[id]
}
})
.catch( function(error) {
console.log('There is an error.', error);
});
})
service.js
...
.factory('MyService', function($http) {
return { getData: getData };
function getData() {
return $http.get('data.json');
}
})
item.html
<div ng-controller="ItemCtrl">
<p>{{item.name}}</p>
<p>{{item.city}}</p>
</div>
有什么建议吗?
提前致谢!
您可以使用您的服务加载对象列表,并将它们保存在服务内的变量中,这样您就不会每次都调用该服务(以获取 json 文件),除非您需要每次都获取最新数据。
如果您对以下代码有疑问,请检查 plunkr:https://plnkr.co/edit/1k3RhxIWnsdY7rPViRhK?p=preview
在你的服务中你可以做到这一点
...
.factory('MyService', function($http, $q, $filter) {
var itemList = [];
var self = {};
self.getList = getList;
self.getItem = getItem;
return self;
function getList(){
var defer = $q.defer();
$http.get('data.json').then(function(response){
itemList = response.data;
defer.resolve(itemList); // you can do data manipulation here if you need to
},function(error){
defer.reject(error); //you can customize your error
});
return defer.promise;
}
function getItem(itemId){
if(itemList){
var found = $filter('filter')(itemList, {id:itemId}, true);
return found[0]; //the [0] is to get the first item since found is an array
}
}
})
您可以在控制器加载到您的路由之前在列表控制器中加载数据(项目)。确保在控制器中注入 "items"。
angular.module("myApp").config(function($routeProvider) {
$routeProvider
.when('/list', {
templateUrl: 'templates/list.html',
controller: 'ListCtrl',
resolve: {
items: function(MyService){
MyService.getList().then(function(response){
return response
});
}
}
})
.
...Other Routes Here...
.otherwise({redirectTo: '/'});
});
现在您可以在您的物品控制器中执行此操作
.controller('ItemCtrl',function($scope, $routeParams, MyService) {
var id = $routeParams.id;
$scope.item = MyService.getItem(id);
})