Vincent
Vincent

Reputation: 6188

Share methods between custom directives

What is the most simple way to share a method between 2 directives?

I've tried using a factory and injecting that in my directives. But then I can't pass parameters to the factory. So I can get data back from my factory but I can't make the factory dynamic.

.directive('myFirstDirective', [...])
.directive('seconDirective', [...])
.factory('MenuItems', [function(){
            return "testString";
}]);

By adding the factory to my code I can do in any directive:

var test = MenuItems;

But what I wan't to do is:

var test = MenuItems(myParameter); //so I can change the return in menuItems depending on myParameter

Upvotes: 1

Views: 513

Answers (2)

Nikola Yovchev
Nikola Yovchev

Reputation: 10226

You can use a service to do that:

https://gist.github.com/anonymous/50b659c72249b58c31bf

.factory('MenuItemsService', [function(){
    return {
        getMenuItems : function(parameter){
            if ( parameter === 'foo' ){
                return ['bar', 'jar', 'tar'];
            } else {
                return ['asd', 'bsd', 'csd'];
            }
        }
    };
}]);

Then in each directive you can inject the service, e.g:

MenuItemsService.getMenuItems('foo');
MenuItemsService.getMenuItems('bar');

Upvotes: 2

bekite
bekite

Reputation: 3444

To share data creating a service is the right thing to do.

Create a function on your service to process the data

.factory('MenuItems', function(){
   var someDataToShare = ...
   return {
     someFunction: function(data) {
       // process data here
       return someDataToShare
     }
   }
});

call it like this:

  $scope.processedData = MenuItems.someFunction($scope.someData)

Upvotes: 1

Related Questions