AngularJS函数返回一个命名函数

时间:2017-03-12 20:50:14

标签: angularjs anonymous-function

下面是我尝试在Angular中了解有关服务的更多信息时获得的一些示例代码。这不是我困惑的服务方面,而是构成服务的功能。该函数返回startMonitoring: function(){...}。我以前从未见过这个,我想知道如何使用它。 startMonitoring是函数的名称吗?是否包含函数返回时执行的函数?这种类型的退货有名称吗?

batchModule.factory('routeTemplateMonitor', ['$route', 'batchLog', '$rootScope',
  function($route, batchLog, $rootScope) {
    return {
      startMonitoring: function() {
        $rootScope.$on('$routeChangeSuccess', function() {
          batchLog($route.current ? $route.current.template : null);
        });
      }
    };
  }]);

https://docs.angularjs.org/guide/services的示例代码,讨论服务。

2 个答案:

答案 0 :(得分:1)

您的工厂创建一个功能名称为startMonitoring的对象,并在您调用该函数时执行。

所以要使用它:

monitor.startMonitoring();

使用Object.create方法部分的此页Working with object中,您会看到一个解释。

希望它有所帮助!

编辑:返回类型只是一个普通的javascript对象

答案 1 :(得分:1)

anonymous function expression附加object literal作为CREATE TRIGGER (Transact-SQL)属性的值。

可以写成:

batchModule.factory('routeTemplateMonitor', ['$route', 'batchLog', '$rootScope',
   function($route, batchLog, $rootScope) {
       function startMonitoring() {
           $rootScope.$on('$routeChangeSuccess', function() {
              batchLog($route.current ? $route.current.template : null);
           });
       }
       var service = { startMonitoring: startMonitoring };
       return service;
   };
]);

该函数只应在运行块中调用一次:

app.run(['routeTemplateMonitor', function(routeTemplateMonitor) {
     routeTemplateMonitor.startMonitoring();
}]);

从控制器调用它可能会因多个调用而导致内存泄漏,因为控制器是由ng-viewng-ifng-repeat等指令创建和销毁的。

自动启动监视器

或者,可以在实例化工厂时自动启动监视器:

batchModule.factory('routeTemplateMonitor', ['$route', 'batchLog', '$rootScope',
   function($route, batchLog, $rootScope) {
       function startMonitoring() {
           $rootScope.$on('$routeChangeSuccess', function() {
              batchLog($route.current ? $route.current.template : null);
           });
       }
       var service = { anotherMethod: method };
       startMonitoring();
       return service;
   };
]);
app.run(['routeTemplateMonitor', function(routeTemplateMonitor) {
     console.log("Route Template Monitor Started");
}]);