解决方案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 服务用于具有全局操作或者变量。
在用作全局操作的一般服务中,因为 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 上写信给我们。

日期:2020-06-02 22:18:46 来源:oir作者:oir