Angular在运行时调用服务

时间:2014-09-05 15:28:28

标签: angularjs

我有一个处理我的应用程序菜单的服务我不想从任何控制器调用,哪里是调用我的服务的最佳位置

我的服务有一个register方法

// sample

menuService.register({name: "Person", label: "Person", url: "/persons"});
menuService.register({name: "Company", label: "Companies", url: "/companies"});

定义为

app.service('MenuService', ['$rootScope', function($r) { /*...*/ }

注意:我的服务$rootScope.$emit由指令监听,取决于$rootScope$location

2 个答案:

答案 0 :(得分:1)

你应该使用.run块,但要记住你不能注入.provider来运行块

  yourApp.run(function ($rootScope, $location) {
                // your code goes herer
        });

from docs

运行块是Angular中与main方法最接近的东西。运行块是需要运行以启动应用程序的代码。在配置完所有服务并创建注入器后执行。运行块通常包含难以进行单元测试的代码,因此应在隔离模块中声明,以便在单元测试中忽略它们。

答案 1 :(得分:0)

您可以将菜单公开为MenuService中的模型。

app.service('MenuService', ['$rootScope', function($r) { 
  var svcModel = {
    menus: []
  };

  var registerMenu = function(menu) {
    svcModel.menus.push(menu);
  };

  /*...*/

  return {
    model: svcModel,
    register: registerMenu
    /*...*/
  };
}

然后直接在指令上访问该模型:

app.directive('menuDirective', ['MenuService', function(MenuService) {
  return {
    /*...*/
    link: function(scope, element, attrs) {
      /*...*/
      scope.menus = MenuService.model.menus;
    }
}]);