Angularjs 什么';实现事件以在服务和其他任何东西之间进行通信的最佳方式是什么?

Angularjs 什么';实现事件以在服务和其他任何东西之间进行通信的最佳方式是什么?,angularjs,events,service,Angularjs,Events,Service,假设我有一个控制器,它依赖于news服务。每当发布新闻时,控制器都会显示最新的新闻。我不想使用$broadcast和$on,因为这会对组件的耦合方式产生奇怪的影响。不依赖于新闻的组件仍然可以侦听这些事件 因此,以下是我希望能够做到的: myApp.controller("myController", ["news", function(news){ news.onPublish.addListener(function(story){ ... Show the lates

假设我有一个控制器,它依赖于
news
服务。每当发布新闻时,控制器都会显示最新的新闻。我不想使用
$broadcast
$on
,因为这会对组件的耦合方式产生奇怪的影响。不依赖于
新闻的组件仍然可以侦听这些事件

因此,以下是我希望能够做到的:

myApp.controller("myController", ["news", function(news){
    news.onPublish.addListener(function(story){
        ... Show the latest juicy story.
    });
}]);
news.onPublish
将是一个事件实例,其
Event
定义如下:

Event = function(){
  var listeners = [];

  this.addListener = function(l){
    listeners.push(l);
  }

  this.trigger = function(){
    var params = arguments
    listeners.map(function(l){
      l.apply(undefined, params);
    });
  }

  return this
}

这是实现服务和其他组件之间通信的好方法吗?另外,在
事件结束时调用
$rootScope.$apply
是否合适。触发器
,以便侦听器所做的任何更改都将被拾取?

最好是编写通用的数据存储工厂,为您完成这项工作。下面是一个工作示例:它显示了这是如何工作的。
新闻服务
工厂可以跨多个角度模块使用,也可以在同一模块内使用,如我的示例所示

以下是JS:

var app = angular.module("TestSharing", []);

app.factory("NewsService", [function() {
    var articles = [];
    var makeNews = function (text) {
        articles.push({text: text});
    };
    var getNews = function() {
        return articles;
    };
    return {
        get: getNews,
        make: makeNews 
    };
}]);

app.controller("FirstCtrl", ["$scope", "NewsService", function($scope, NewsService) {
    $scope.articles = function () {
        return NewsService.get();
    };
}]);

app.controller("SecondCtrl", ["$scope", "NewsService",  function($scope, NewsService) {
    $scope.articletext = "";
    $scope.submit = function () {
        NewsService.make($scope.articletext);
    };
}])
HTML:

<div ng-app="TestSharing">
    <div ng-controller="FirstCtrl">
        <span ng-repeat="article in articles()">{{article.text}}<br/></span>
    </div>
    <div ng-controller="SecondCtrl">
        <input type="text" ng-model="articletext"/>
        <button ng-click="submit()">Make some news</button>
    </div>
</div>

{{article.text}}
制造一些新闻

此外,此类服务还可以共享事件。例如,如果您使用工厂公开了一个名为
somethingNew
的对象,该对象仅包含在共享它的其中一个控制器中发生的新情况,则可以实现相同的效果。我们的想法是只在您想要的地方侦听更改(使用类似于
$scope.$watch(NewsService.somethingNew,function(now,then){…})
),这同样简单。

如果我理解正确,这依赖于NewsService.get()通过引用返回文章列表,允许服务用户直接修改数组。是的,但同时为了避免它,请在
get
函数中执行
return angular.copy()
。除非执行$rootScope.$apply提交新闻,否则不会破坏绑定吗?它的行为应该相同,只有当您希望限制对包含新闻的数组的访问时,才应执行此操作。