控制器和服务之间事件处理的范围

时间:2015-05-04 13:01:24

标签: angularjs event-handling angularjs-scope

我的控制器在其范围内声明了一个变量。我希望这个变量可以在$ rootScope。$ on中访问,但似乎并非如此。这是我的问题。

这是我的控制器

app.controller('MainCtrl', function($rootScope, OnTest) {
    $scope.variable = null;

    $rootScope.$on('eventCalled', function() {
        if ($scope.variable == null) {
            alert("THIS IS MY ISSUE: SHOULD NOT BE NULL");
        }
    });

    $scope.methodCalledFromTheView = function () {
        $scope.variable = {age: 23};
        TestApp.method1();
    }
});

这是我的服务:

app.service('TestApp', function ($rootScope) {
    this.method1 = function () {
        $rootScope.$emit("eventCalled");
    }
});

输出

“这是我的问题:不应该是空的”

我应该更改什么,以确保$ rootScope内可以访问$ scope.variable。$ on?

1 个答案:

答案 0 :(得分:0)

这是针对双向绑定的更多基于事件的更新的解决方案。此外,通过$emit的工作方式,它只将事件发送到$ rootScope而不是所有子项。 $ broadcast更适合应用于控制器或指令(嵌套在DOM中的任何东西),而$ emit更适合服务,因为服务通常不会创建隔离范围。

// CONTROLLERS SHOULD NOT ACCESS $ROOTSCOPE, BUT USE THEIR OWN $SCOPE
app.controller('MainCtrl', function($scope, TestApp) {
    $scope.variable = null;

    TestApp.broadcastEventCalled();

    TestApp.onEventCalled($scope, function() {
      $scope.variable = {age: 23};
      if ($scope.variable == null) {
          alert("THIS IS MY ISSUE: SHOULD NOT BE NULL");
      }
    });
});
//SERVICE SHOULD ONLY HAVE EVENT THROWERS AND $ROOTSCOPE
app.service('TestApp', function ($rootScope) {
    this.broadcastEventCalled = function () {
      $rootScope.$broadcast("eventCalled");
    };

    this.onEventCalled = function (scope, callback) {
      return scope.$on('eventCalled', function () {
        callback();
      });
    };
});

希望它有所帮助!