AngularJS:我能';t查看在get中创建的范围
我做了两个控制器: 一个是一个UsersCtrl,其中我使用AngularJS:我能';t查看在get中创建的范围,angularjs,angularjs-scope,ionic-framework,ionic,http-get,Angularjs,Angularjs Scope,Ionic Framework,Ionic,Http Get,我做了两个控制器: 一个是一个UsersCtrl,其中我使用$http.get()从一个json中获取所有用户。当你点击一个用户时,你进入另一个带有另一个控制器的页面(UsersDetailCtrl),在那里我必须使用通过url传递的$stateParams.id,并检查$http.get中是否有匹配的id 我向您展示我的用户detailctrl,然后告诉您我的问题: .controller('UsersDetailCtrl', function($scope, $http, $ionicMod
$http.get()
从一个json中获取所有用户。当你点击一个用户时,你进入另一个带有另一个控制器的页面(UsersDetailCtrl),在那里我必须使用通过url传递的$stateParams.id
,并检查$http.get
中是否有匹配的id
我向您展示我的用户detailctrl
,然后告诉您我的问题:
.controller('UsersDetailCtrl', function($scope, $http, $ionicModal, $window, $stateParams, $ionicLoading, $timeout) {
console.log($stateParams.id);
$scope.loading = $ionicLoading.show({
animation: 'fade-in',
showDelay: 0,
showBackdrop: true
});
var urlUtenti = "users.json";
$http.get(urlUtenti).success(function (response) {
for (var i = 0; i < response.length; i++) {
if (response[i].id == $stateParams.id) {
$scope.user = response[i];
}
}
$timeout(function(){
$ionicLoading.hide();
},1000);
})
console.log($scope.user);
})
.controller('UsersDetailCtrl',函数($scope、$http、$IonicModel、$window、$stateparms、$ionicLoading、$timeout){
log($stateParams.id);
$scope.loading=$ionicLoading.show({
动画:“淡入”,
显示延迟:0,
背景:真的
});
var urlunteti=“users.json”;
$http.get(urlunteti).success(函数(响应){
对于(变量i=0;i
进入$http.get
,准确地进入for子句
,我有一个$scope.user=response[I]
,如果我在console.log(response[I])
或console.log($scope.user)
for子句中做一个响应,我就会收到我想要的对象,但是正如您在下面看到的,我将控制台.log($scope.user)
放在控制器的末尾,因为我需要在html视图中使用该作用域。
结果如何<代码>未定义
那么为什么在for子句中它是正确的,而在http中它不是?
如何在html视图中使用$scope.user
另外,我已经尝试将作用域设置为对象,但它返回空对象。。数组也是这样。范围有什么问题
谢谢。如评论所述,$scope.user
设置得很好(如果有一个匹配的$stateParams.id
),您在控制台.log($scope.user)
日志记录未定义的
中的“问题”是执行得太早
流程如下所示:
->http get开始异步执行$http.get(urlunteti).success(successFunction)
(外部console.log($scope.user)
)->立即执行(successFunction
尚未调用,因此此时未定义successFunction
)$scope.user
- HTTP GET成功返回->
被执行并且successFunction
被设置$scope.user
.controller('UsersDetailCtrl', function($scope, $http, $ionicModal, $window, $stateParams, $ionicLoading, $timeout) {
console.log($stateParams.id);
$scope.loading = $ionicLoading.show({
animation: 'fade-in',
showDelay: 0,
showBackdrop: true
});
var urlUtenti = "users.json";
$http.get(urlUtenti).success(function (response) {
for (var i = 0; i < response.length; i++) {
if (response[i].id == $stateParams.id) {
$scope.user = response[i];
}
}
// console.log moved INSIDE the success function (before timeout)
console.log($scope.user);
$timeout(function(){
$ionicLoading.hide();
},1000);
})
})
.controller('UsersDetailCtrl',函数($scope、$http、$IonicModel、$window、$stateparms、$ionicLoading、$timeout){
log($stateParams.id);
$scope.loading=$ionicLoading.show({
动画:“淡入”,
显示延迟:0,
背景:真的
});
var urlunteti=“users.json”;
$http.get(urlunteti).success(函数(响应){
对于(变量i=0;i
您的控制台.log($scope.user)
在$http.get
之外,因此它将在请求解决之前发生。看见另外,为什么每次迭代响应时都要覆盖$scope.user
?错误:[$rootScope:inprog]$digest已在进行中
已尝试过。:)@KaranKumar不,这很可能会导致一个错误,说摘要周期已经在进行中。@LudovicoLoreti哎呀,我错过了if
。有实际问题吗?你所拥有的应该很好用。当HTTP请求被解析并且您的一个响应与ID匹配时,$scope.user
将被设置,该设置应显示在任何HTML视图中。如果您希望在找到用户记录后立即记录该记录,请在for
循环之后(在$timeout
调用之前)执行,例如控制台.log(“$scope.user”,“$scope.user”)
。在找到用户后,我还将中断,这样您就不会进行不必要的迭代