Angularjs $rootscope对象模型来自服务并非(始终)在每个控制器中都可用
在我的应用程序定义中,我有:Angularjs $rootscope对象模型来自服务并非(始终)在每个控制器中都可用,angularjs,angularjs-scope,Angularjs,Angularjs Scope,在我的应用程序定义中,我有: var myVtModule = angular.module('vtApp', ['myAppDev','mongoAPI']); myVtModule.run(function($rootScope, $location, Shop){ $rootScope.shopData = {}; Shop.getShop(function(response){ $rootScope.shopData = response; });
var myVtModule = angular.module('vtApp', ['myAppDev','mongoAPI']);
myVtModule.run(function($rootScope, $location, Shop){
$rootScope.shopData = {};
Shop.getShop(function(response){
$rootScope.shopData = response;
});
})
Shop是一项从服务器检索数据的服务,它可以正常工作。问题是,在控制器中,我并不总是能够访问shopData,有时是空的,有时工作正常
function SupportCtrl($rootScope, $scope) {
console.log ($rootScope.shopData);
}
为什么在收到服务的响应时不进行更新?我不能将Shop.getShop放在控制器中,因为我到处都需要它…如果您需要控制器中的结果,您应该跳过
myVtModule。运行并执行类似操作:
function SupportCtrl($scope, Shop) {
Shop.getShop(function(response){
console.log (response);
//do something, put response in $scope or $scope.$rootScope etc...
});
}
我的建议是使用控制器继承和服务,以便您的子控制器可以始终访问商店。下面是一个演示:
代码:
设置子控制器关系的HTML:
<html ng-app="myApp" >
<head>
<meta charset="utf-8">
<title>AngularJS Plunker</title>
<link rel="stylesheet" href="style.css">
<script>document.write("<base href=\"" + document.location + "\" />");</script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
The store is {{shop.storename}}
<div ng-controller="ChildCtrl">
The store name is: {{shop.storename}}
</div>
</body>
</html>
安古拉斯普朗克
文件。填写(“”);
商店是{shop.storename}
商店名称为:{shop.storename}
您会注意到,由于父作用域检索到了shop
,因此子级可以使用它。我对服务进行了设置,因此您可以使其可测试/等等。除了继承之外,您还可以轻松地将ShopService
注入每个控制器并让它们进行调用,但如果您有很多控制器,则可能会变得单调乏味
有关作用域继承的更多信息:
您的ng控制器作用域所有原型都从rootScope继承(最终),因此它们都可以访问您在rootScope上定义的任何对象。由于从服务器检索数据是一个异步操作,因此控制器可能会在返回服务器数据之前执行
您可以在控制器中使用来确定数据实际可用的时间。但是,如果您只想在数据可用时更新视图,则不必使用$watch。当数据可用时,Angular应自动更新视图。例如:
function SupportCtrl($rootScope, $scope) {
$scope.shopData = $rootScope.shopData;
}
那么在你看来,
<div ng-controller="SupportCtrl">shopData = {{shopData}}</div>
我不能这样做,因为我几乎在每个控制器中都使用它。这就是为什么我需要将它从$rootScope提供到任何地方。
<div ng-controller="SupportCtrl">shopData = {{shopData}}</div>
app.run(function($rootScope, $timeout){
$rootScope.shopData = [];
$timeout(function() {
angular.copy([{d1: 'data1', d2: 'data2'}], $rootScope.shopData);
}, 2000);
});