解决方案1
这个解决方案很好,如果我们只在 1 个控制器/指令中使用实时数据。
解决方案是:我们可以在我们的控制器/指令中设置间隔,我们将在我们的范围内有一个变量,它保存来自服务器的数据。
我们可以在我们的视图中打印该值,AngularJs 会自动执行此操作。
我们甚至可以在其上设置侦听器。
这只是一个非常简单的方法。
然后我们就不需要 DataManager 服务。
这是一个示例:
angular.module('myModule') .controller("MyController",function($scope, Person, $interval){ $scope.user = null; $interval(function(){ $http.get([url]) .then(function(data){ $scope.user.name = data.name; $scope.user.count = data.count; }); //getting the data every 1 minute }, 60000); })
也许你会想,为什么我们需要Person 服务?
一般来说,我们是对的,但我们可以在我们的控制器中使用它来更新 Person 服务数据(用于另一个组件)。
许多 AngularJs 开发人员都了解 Angularjs 服务、控制器和指令。
如我们所知,Angularjs 服务用于具有全局操作或者变量。
在用作全局操作的一般服务中,因为 Angularjs 已经具有 Value 功能。
由于 AngularJS 现在是一个已弃用的框架,我们可以改用 JavaScript 现代框架,如 Vuejs、React 和 Angular。
现在让我们谈谈服务和控制器的配置和架构。
想象一下,你有一个代表一个人的服务。
它有所有的 getter 和 setter 方法。
我们有另一个服务作为数据管理器。
它每 1 分钟从任何地方获取数据。
我们有一些控制器和一些指令,我们想在它们内部绑定给定的数据。
只是一个简单的例子。
我们有三个控制器和两个指令。
其中一些需要绑定数据,它们必须使用我们的服务。
请记住,我们有一个名为 Person 的服务和一个名为 DataManager 的服务。
我们能做些什么来解决我们的问题?
让我们看看我们得到了什么。
angular.module('myModule') .service('Person', function() { var name = 'Default'; var listCount = 0; this.getName = function() { return name; }; this.setName = function(Name) { name = Name; }; this.getListCount = function() { return listCount; }; this.setListCount = function(ListCount) { listCount = ListCount; }; })
angular.module('myModule') .service('DataManager', function($interval, $http, Person) { $interval(function(){ $http.get([url]) .then(function(data){ Person.setName(data.name); Person.setListCount(data.count); }); //getting the data every 1 minute }, 60000); })
以下服务在任何控制器或者指令中提供数据。
现在让我们看看如何绑定这些数据,例如,在控制器内部。
这是我们的控制器。
angular.module('myModule') .controller("MyController",function($scope, Person){ $scope.user = null; //here we need live data for person })
如我们所见,如果我们想打印有数据,就会遇到问题,因为我们无法在任何值上设置侦听器来绑定数据(我们从服务中获取数据)。
但是怎么做呢?
如何在我们的控制器中拥有实时数据?
以下是该问题的解决方案。
解决方案2
第二种解决方案很好,如果我们有很多组件并且我们需要在许多组件(控制器/指令)中使用服务(有实时数据)。
解决方案是:AngularJs Events。
我们可以在任何事件上设置监听器,当服务从服务器获取新的实时数据时,它会发送一个信号,表示它有新数据。
我们可以随心所欲地使用该事件。
让我们看看如何做到这一点。
angular.module('myModule') .service('DataManager', function($interval, $http, Person, $rootScope) { $interval(function(){ $http.get([url]) .then(function(data){ Person.setName(data.name); Person.setListCount(data.count); //here we have to send signal that we have a new live data from the server //we use Root Scope, because we don't know what scope architecture do we have $rootScope.$broadcast("newPersonData"); }); //getting the data every 1 minute }, 60000); })
如我们所见,我们可以随时随地使用此事件。
我们可以为这个事件设置监听器,当服务有新数据时,我们可以调用Person的方法来更新它。
我们甚至可以将数据发送到“eventName”。
我们还有另一个很好的解决方案。
如果我们对此感兴趣,请在 Google+、Facebook 和 Twitter 上写信给我们。