Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs $rootscope对象模型来自服务并非(始终)在每个控制器中都可用_Angularjs_Angularjs Scope - Fatal编程技术网

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);
});