gpt4 book ai didi

javascript - AngularJS 路由解析获取带有 id 的 $http 数据

转载 作者:行者123 更新时间:2023-12-03 10:20:12 25 4
gpt4 key购买 nike

我有几个依赖服务器数据的屏幕和 Controller 。因此,我想通过路由器解析功能来解决数据依赖性,以使其在渲染屏幕之前通过 Promise 来处理所有数据。但是,我不确定我是否正确理解了用法,因为以下示例似乎不起作用。为什么?

angular.module('app',['ngRoute'])
.service('Data1', function ($q, $routeProvider, $http) {
var self = this;

this.fetch = function() {return $http.get('/json/data1',{id:$routeProvider.id})}
}
.service('Data2', function ($q, $routeProvider, $http) {
var self = this;
this.fetch = function() {return $http.get('/json/data2',{id:$routeProvider.id})}
}
.config(function($routeProvider){
§routeProvider.when('/:id',{
controller:'TestCtrl',
templateUrl:'template.html',
resolve: {
data1: function (Data1) { return Data1.fetch(); },
data1: function (Data2) { return Data2.fetch(); }
}

});
})
.controller('TestCtrl', function($location, $routeParams, $http, data1,data2) {
console.log(data1);
console.log(data2);
});

最佳答案

下面是如何正确使用 resolve$routeProvider 的示例。首先,我像您一样定义了两个工厂,然后在我的配置中设置了一条路线,我想将工厂中的数据注入(inject)其中。我告诉它我想使用什么 Controller ,模板在这种情况下是无关紧要的。然后在解析下,我给它一个具有两个属性的对象,即函数,someDatasomeMoreData。在这两个函数上,我注入(inject)我的 data1data2 工厂和 $routeParams,从工厂获取数据,然后返回数据。

在我的 Controller 定义中,我告诉它我想注入(inject) $scope 然后我告诉它我想注入(inject)另外两个东西,这些是我在 $routeProvider< 中定义的解析属性.

需要注意的一件事是,如果您在想要解析数据的工厂中进行实际的 API 调用,则在数据解析完成之前页面不会加载, Controller 甚至不会启动,直到这些都完成完毕。因此,您可能想想出一些方法来执行加载动画,StackOverflow 上有很多关于如何执行此操作的示例。

angular.module('app.factories', [])
.factory('data1', ['$q', '$timeout', function($q, $timeout) {
return {
getData: function(id) {
var deferred = $q.defer();
var promise = deferred.promise;

$timeout(function() {
deferred.resolve('this is factory 1, id: ' + id);
}, 2000);

return promise;
}
};
}])
.factory('data2', ['$q', '$timeout', function($q, $timeout) {
return {
getData: function(id) {
var deferred = $q.defer();
var promise = deferred.promise;

$timeout(function() {
deferred.resolve('this is factory 2, id: ' + id);
}, 2000);

return promise;
}
};
}]);

angular.module('app', ['ngRoute', 'app.factories'])
.config(['$routeProvider',
function($routeProvider) {
$routeProvider
.when('/', {
controller: 'defaultCtrl',
template:'<a href="#/1">Go to route with parameter on it</a>'
})
.when('/:id', {
controller: 'testCtrl',
template: '<span ng-bind="string1"></span><br /><span ng-bind="string2"></span>',
resolve: {
someData: ['data1', '$route',
function(data1, $route) {
console.log('resolving someData');
return data1.getData($route.current.params.id).then(
function(response) {
return response;
});
}
],
someMoreData: ['data2', '$route',
function(data2, $route) {
console.log('resolving someMoreData');
return data2.getData($route.current.params.id).then(
function(response) {
return response;
});
}
]
}
});
}
])
.controller('defaultCtrl', function() { })
.controller('testCtrl', ['$scope', 'someData', 'someMoreData',
function($scope, someData, someMoreData) {
console.log('in route with id param');
$scope.string1 = someData;
$scope.string2 = someMoreData;
}
]);
<!DOCTYPE html>
<html ng-app="app">

<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular-route.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>

<body>
<div ng-view>

</div>
</body>

</html>

编辑修改它,以便您的工厂位于自己的模块中,并作为应用程序模块的依赖项注入(inject),而不是位于应用程序模块本身上,恕我直言,这倾向于更好的架构(大多数时候我为每个单独的工厂提供自己的模块) ,但为了简洁起见,我保持简单)

关于javascript - AngularJS 路由解析获取带有 id 的 $http 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29678988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com