2014-09-05 178 views
0

服務我有一個服務處理我不從任何控制器,其中是叫我的服務角呼叫運行

我的服務最好的地方想調用我的應用程序的菜單有一個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

+0

該指令你提到的是用於顯示菜單選項? – bmleite 2014-09-05 15:52:29

+0

耶!但過了一段時間,我認爲也許是一個錯誤使用$發射和$時,可能是因爲當$ emit被稱爲 – rkmax 2014-09-05 16:05:01

回答

1

你應該使用.run塊爲,但請記住,你不能注入.provider運行阻滯

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

from docs

運行塊是在角的主要方法是最接近。運行塊是需要運行以啓動應用程序的代碼。在完成所有服務配置並創建噴油器後執行。運行塊通常包含很難進行單元測試的代碼,因此應該在隔離模塊中聲明,以便在單元測試中可以忽略它們。

+0

時$ on監聽器不能附加問題是當我從'.run'方法調用服務該指令沒有準備好,並且不工作 – rkmax 2014-09-05 15:33:51

+0

如果你依賴於你的指令那就意味着你可以從你的指令中調用它 – 2014-09-05 15:36:15

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; 
    } 
}]);