2013-04-25 53 views
0

不(总是)可在我的应用程序定义,我有:

var myVtModule = angular.module('vtApp', ['myAppDev','mongoAPI']); 
myVtModule.run(function($rootScope, $location, Shop){ 
    $rootScope.shopData = {}; 
    Shop.getShop(function(response){ 
     $rootScope.shopData = response; 
    }); 
}) 

店是从服务器获取数据的服务,它的工作原理。问题是,在控制器中,我并不总是可以访问shopData,有时是空的,有时可以正常工作。

function SupportCtrl($rootScope, $scope) { 
    console.log ($rootScope.shopData); 
} 

为什么在它从服务接收到响应时不更新?我不能把Shop.getShop的,因为我需要它无处不在控制器...

回答

0

如果你需要在你的控制器的结果,你应该跳过myVtModule.run和做这样的事情,而不是:

function SupportCtrl($scope, Shop) { 
    Shop.getShop(function(response){ 
    console.log (response); 
    //do something, put response in $scope or $scope.$rootScope etc... 
    }); 
} 
+0

我几乎在每一个控制器使用它,我不能这样做。这就是为什么我需要将它从$ rootScope提供到任何地方。 – 2013-04-25 14:06:20

1

我的建议是使用控制器继承和服务,以便您的子控制器始终可以访问该商店。这里是一个演示:

http://beta.plnkr.co/edit/DtjwLMi3jHCdzThEJDNn?p=preview

代码:

angular.module('myApp', ['myApp.services']); 

function MainCtrl($scope, ShopService) { 
    $scope.shop = ShopService.getShop(); 
} 
function ChildCtrl($scope) { 
} 
angular.module('myApp.services', []). 
    factory('ShopService', function ($rootScope) { 
     var shop = { 
      storename: 'your store' 
     }; 

     var service = { 
       getShop: function() { 
       return shop; 
       } 
     } 

     return service; 
    }); 

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是提供给孩子因为父范围检索它。我建立了服务,以便让它可测试/等。除了继承之外,您可以轻松地将ShopService注入每个控制器并让他们拨打电话,但是如果您有许多控制器可能会变得乏味。

的范围继承一些更多的信息:

can i inherit a parent controller's variables? http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller

0

你的NG-控制器作用域的所有prototypically从rootScope(最终)继承,所以他们都可以访问到你rootScope定义的任何对象。由于从服务器检索数据是异步操作,因此您的控制器可能会在服务器数据返回之前执行。您可以在控制器中使用$watch来确定数据何时可用。但是,如果您只是希望在数据可用时更新视图,则不必使用$ watch。数据可用时,Angular应自动更新视图。例如,

function SupportCtrl($rootScope, $scope) { 
    $scope.shopData = $rootScope.shopData; 
} 

然后在您的视图:

<div ng-controller="SupportCtrl">shopData = {{shopData}}</div> 

Fiddle - 我模拟使用$timeout服务器延迟。请注意,在拨弄我也用angular.copy()更新控制器具有参考,而不是分配$rootScope.shopData到一个新的/不同的数组:

app.run(function($rootScope, $timeout){ 
    $rootScope.shopData = []; 
    $timeout(function() { 
     angular.copy([{d1: 'data1', d2: 'data2'}], $rootScope.shopData); 
    }, 2000); 
}); 
相关问题