AngularJS中的$rootScope在控制器中保持未定义,尽管注入?
这是一个用于移动应用程序的小型ionic/angularJS项目 我试图读取index.html所在文件夹中的JSON文件,然后在运行段中将其分配给$rootScope变量,然后在控制器中检索$rootScope变量值。但它根本不起作用,尽管有服务注入等等 这是我的JSON文件:AngularJS中的$rootScope在控制器中保持未定义,尽管注入?,angularjs,controller,ionic,rootscope,Angularjs,Controller,Ionic,Rootscope,这是一个用于移动应用程序的小型ionic/angularJS项目 我试图读取index.html所在文件夹中的JSON文件,然后在运行段中将其分配给$rootScope变量,然后在控制器中检索$rootScope变量值。但它根本不起作用,尽管有服务注入等等 这是我的JSON文件: {"docs":[{"Name":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"}, {"Name":"Ana Tr
{"docs":[{"Name":"Alfreds Futterkiste","City":"Berlin","Country":"Germany"},
{"Name":"Ana Trujillin Moreo","City":"México D.F.","Country":"Mexico"}
]
}
这是我的app.js/script.js:
angular.module('starter', ['ionic'])
.run(function($ionicPlatform, $rootScope, $http) {
$ionicPlatform.ready(function() {
$rootScope.myDocs = $http.get("/customers.json")
.success(function (response) {
return response.docs;
});
});
})
.controller('MyCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
$scope.myDocs = $rootScope.myDocs;
//$scope.myDocs = [{'Name': 'a1'},{'Name': 'b1'},{'Name': 'c1'}];
$scope.myStr = JSON.stringify($rootScope.myDocs);
}])
这是my index.html中的相关部分:
<body ng-app="starter">
<ion-pane>
<ion-header-bar class="bar-stable">
<h1 class="title">Ionic Blank Starter</h1>
</ion-header-bar>
<ion-content ng-controller="MyCtrl">
<ion-list>
<ion-item ng-repeat="x in myDocs">
{{x.Name}}
</ion-item>
</ion-list>
</ion-content>
</ion-pane>
</body>
离子空白起动器
{{x.Name}
我在这里看到了其他类似的例子,但这仍然不起作用,我一直在用我的头撞墙来实现一个非常简单的事情
非常感谢快速帮助。
这是一个问题:由于
ionicPlatform.ready
而您没有正确使用$http
承诺,因此出现了时间问题
这是一种方法:
.run(function($rootScope, $http) {
// $http returns a promise, not the value
$rootScope.docPromise = $http.get("/customers.json")
.then(function(response) {
return response.docs;
});
})
.controller('MyCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
// you get the value within a .then function on the promise
$rootScope.docPromise.then(function(result) {
$scope.myDocs = result;
})
}])
您不太可能需要在ionicPlatform.ready
中进行此http调用。如果你不需要这样做,那么这只是在拖延通话,没有任何好处。如果出于某种原因确实需要在ready函数中进行调用,那么有很多方法可以解决这个问题。以下是一个例子:
// inject $q service
var deferred = $q.defer();
$rootScope.docPromise = deferred.promise;
$ionicPlatform.ready(function() {
$http.get(etc).then(function(response) {
deferred.resolve(response.docs);
});
});
// use $rootScope.docPromise as in the previous example
您可能会假设
$http.get()
上的success
方法的返回值将分配给$rootScope
上的myDocs
属性,但它不是这样工作的$http.get()
是一个异步操作,一旦响应可用,就会调用成功回调。此外,成功回调的返回值也没有分配,因为它发生在将来的某个时候
您需要更新ready()
,如下所示
$ionicPlatform.ready(function() {
/* get will return a promise, cache it in on rootScope for use in controller*/
$rootScope.httpPromise = $http.get("/customers.json");
});
在控制器中
.controller('MyCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
$rootScope.httpPromise.then(function(response){
$scope.myDocs = response.data.docs;
});
}]);
这样做的缺点是您不知道何时设置
$rootScope.myDocs
。OP可能期望console.log($rootScope.myDocs)
在其控制器中具有该值,但它不会。@m59。。。是的,我现在明白了。尽管我在成功回调中缓存来自http调用的响应,但在调用完成之前,控制器可能会被调用,这会再次返回未定义的。谢谢你指出这一点。我更新了我的答案以处理此问题:)您仍然存在$ionicPlatform.ready
的异步问题。在执行控制器功能时,$rootScope.httpPromise
可能尚未分配。我的回答是这样的。欢迎来到堆栈溢出!请务必查看以下教程:。如果有任何答案可以解决您的问题,请使用复选标记(它将变为绿色)将最有用的答案标记为“已接受”,以表示您的感谢并帮助未来的访问者。这正是我要写的+1另外,我肯定会考虑使用路由器(UI路由器),并解决在视图呈现之前为特定视图加载数据的问题。