0

我有一个这样的控制器:

function MyCtrl($scope) {

  $scope.doSomething = function(){
    alert("Do something!");
  }

}

我有多个依赖于此的视图(即以下的多个):

  <div ng-controller="MyCtrl">
    ...
  </div>

问题是,控制器依赖的数据需要在后台加载(控制器不加载该数据),数据准备好后会调用回调(dataIsReady())。

function dataIsReady(){
  // TODO: call the doSomething() function
}

现在,我想从 dataIsReady() 函数中调用 MyCtrl 内部的 doSomething() 函数。我怎样才能做到这一点?

4

2 回答 2

4

我认为您需要的是数据服务,然后您可以将其注入您的控制器。您可以在数据服务上调用一个函数,该函数将处理数据的检索并返回一个“promise”,然后可以在数据加载时触发您的回调函数。看看下面的代码,它是来自 egghead.io 的稍微修改的版本:

Plunker 演示(带本地存储): http ://plnkr.co/edit/9w2jTg?p=preview

var myApp = angular.module('myApp', []);

myApp.factory('AvengersService', function ($http) {

    var AvengersService = {
        getAsyncCast: function () {           
            // $http returns a promise, which has a then function, which also returns a promise
            var promise = $http.get("avengers.json") // or some JSON service
                .then(function (response) {
                   // The 'then' function here is an opportunity to modify the response
                   // The return value gets picked up by the 'then' in the controller.
                   return response.data;
            });
            // Return the promise to the controller
            return promise;
        }
    };

    return AvengersService;
});

myApp.controller('AvengersCtrl', function($scope, AvengersService) {
    // Call the async method and then do something when the data is retrieved
    AvengersService.getAsyncCast()
        .then(function (asyncData) {
            // Callback logic that depends on the data goes in here
            console.info("Cast pulled async.");
            $scope.avengers.cast = asyncData;
        });              

});

希望有帮助。

于 2013-05-16T01:45:11.393 回答
2

注意:这个答案中的这种方法是非常错误的,一个人不应该访问角度之外的控制器范围,或者根本不应该访问控制器之外的范围。如果您尝试多次调用它,这也会非常慢。除此之外,它很好。我给出这个答案是因为它也是最简单的方法。不过,我永远不会在生产中使用这种代码。适当的方法是编写一个服务来与控制器进行通信。

鉴于您已$scope.doSomething在中定义MyCtrl

var scp = angular.element('[ng-controller="MyCtrl"]').scope();
scp.doSomething();

将调用doSomething控制器中定义的方法。

于 2013-05-16T05:45:13.363 回答