2014-09-05 3 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

+0

да! но через некоторое время я думаю, что, возможно, это ошибка использования $ emit и $ on, когда возможно, что $ on listener не может быть присоединен, когда $ emit называется – rkmax

ответ

1

вы должны использовать .run блок для этого, но имейте в виду, вы не можете вводить .provider для запуска Блокировать

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

from docs

Run блоки ближе всего в Угловое к основному методу , Блок запуска - это код, который нужно запустить для запуска приложения. Он выполняется после настройки всей службы и создания инжектора. Блоки запуска обычно содержат код, который трудно тестировать, и по этой причине должны быть объявлены в изолированных модулях, чтобы их можно было игнорировать в модульных тестах.

+0

. Проблема заключается в том, что я вызываю службу из метода '.run' директива не готова и не работает – rkmax

+0

, если вы зависите от своей директивы, которая означает, что вы можете назвать ее из своей директивы –

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; 
    } 
}]); 
Смежные вопросы