Angular $ rootscope。$广播服务中的正确用法

时间:2015-12-15 14:26:02

标签: angularjs angularjs-rootscope

根据我的阅读,似乎使用$ rootScope。除非绝对必要,否则不建议使用$ broadcast。我在服务中使用它来通知控制器变量已经改变。这是不正确的?有没有更好的方法呢?我是否应该使用watch(即使变量仅在用户交互时发生变化)?

服务:

section.Add(new Paragraph("   ", m_font));

//在要通知的控制器中:

function Buildservice($rootScope) {
        var vm = this;
        vm.box= [];

    var service = {
        addItem: addItem,

    };
    return service;

    // Add item to the box
   // Called from a directive controller
    function addItem(item) {
        vm.box.push(item);
        broadcastUpdate();
    }

    function broadcastUpdate() {
        $rootScope.$broadcast('updateMe');
    }

//并从一个单独的指令控制器:

    // Listener for box updates
    $scope.$on('updateMe', function() {
        // update variable binded to this controller
    });

所以这对我来说很好,但我无法弄清楚这是否是我应该这样做的方式。感谢帮助!

2 个答案:

答案 0 :(得分:0)

如果你在同一个模块中,为什么不使用$ scope而不是$ rootScope?

答案 1 :(得分:0)

您可以使用回调函数通知控制器某些内容已更改。您可以从控制器向服务提供函数,并在更改变量时调用该特定函数。如果需要,您还可以通知多个控制器。

我创建了一个小例子:

HMTL:

<div ng-controller="CtrlA as A">
  {{A.label}}
  <input type="text" ng-model="A.input" />
  <button ng-click="A.set()">set</button>
</div>
<div ng-controller="CtrlB as B">
  {{B.label}}
  <input type="text" ng-model="B.input" />
  <button ng-click="B.set()">set</button>
</div>

JS

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

app.controller('CtrlA', function(AService) {
  var vm = this;
  vm.label = AService.get();

  vm.notify = function() {
    vm.label = AService.get();
  }

  vm.set = function() {
    AService.set(vm.input)
  }

  AService.register(vm.notify);
});

app.controller('CtrlB', function(AService) {
  var vm = this;
  vm.label = AService.get();

  vm.notify = function() {
    vm.label = AService.get();
  }

  vm.set = function() {
    AService.set(vm.input)
  }
  AService.register(vm.notify);
});



app.factory("AService", function() {

  var myVar = "Observer";
  var observers = [];

  return {
    get: function() {
      return myVar;
    },

    set: function(name) {
      console.log(name);
      myVar = name;
      this.notify();
    },

    register: function(fn) {
      observers.push(fn);
    },

    notify: function() {
      for( i = 0; i < observers.length; i++) { 
        observers[i]();
      }
    }
  }
})

执行此操作时,您会看到当内部变量发生更改时,控制器会收到通知。 (注意:我没有从列表中过滤原始发件人)(Plnkr