2014-01-08 2 views
0

Я постепенно получаю привязку к угловым директивам и до сих пор прибегал к созданию сервиса в качестве посредника между контроллерами.Угловые директивы: связь с контроллером без услуг

Мне просто интересно, в контексте директив (и функций связывания) можно ли предоставить контроллеру доступ к переменным из функции связывания? (Без службы или глобальных переменных).

module.exports = function() { 
    return { 
     restrict: 'A', 
     templateUrl: 'partials/collection', 
     link: function(scope, element, attrs) { 
     var name = attrs.collectionName; 
     // from here 
     }, 
     controller: function($scope, socket) { 
     $scope.models = []; 
     // to here 
     socket.on('ready', function() { 
      socket.emit(name + '/get'); 
     }); 

     } 
    } 
    }; 

Я хочу значение атрибута имени-коллекции быть доступным в моем контроллере, так что я могу сделать соответствующие вызовы сокетов. Есть идеи?

ответ

1

У них одинаковый объем, поэтому это должно сработать.

module.exports = function() { 
    return { 
     restrict: 'A', 
     templateUrl: 'partials/collection', 
     link: function(scope, element, attrs) { 
     scope.name = attrs.collectionName; 
     // from here 
     }, 
     controller: function($scope, socket) { 
     $scope.models = []; 
     // to here 
     socket.on('ready', function() { 
      socket.emit($scope.name + '/get'); 
     }); 

     } 
    } 
    }; 
0

Возможно, это лучший способ сделать это, но мне удалось обойти эту проблему, изменив зависимости функций диспетчера, чтобы включить аргумент $ element. Затем просто используется jqLite, чтобы получить значение рассматриваемого атрибута.

controller: function($scope, $element, socket) { 
    var name = $element.attr('collection-name'); 
} 

Это не фантастически элегантный, но он работает.

2

Вы можете добавить метод на контроллер и вызвать его из функции связи.

controller: function($scope, socket) { 
    this.setSocket = function(name){ 
     {...} 
    } 
} 

На ссылке:

link: function(scope, element, attrs, controller){ 
    var name = attrs.collectionName; 
    controller.setSocket(name); 
} 
+1

Я думаю, что контроллер передается функции связи является контроллером (s) 'require'ed директивы, а не регулятор тока, поэтому я не думаю, что это даст то, что ОП хочет. –

1

Есть несколько способов сделать то, что вы хотите

  • Просто поместите все в функции связи. Вы можете установить функции и переменные в области, точно так же, как вы можете добавить контроллер.

  • Просто поместите все в контроллер с точки зрения установки переменных области или функций. Он вводится с $attrs, который содержит нормализованные значения атрибутов, поэтому вы имеете доступ к атрибутам, если они вам нужны.

Насколько я знаю, в большинстве случаев не имеет значения, где вы назначаете переменные или функции в области. Основное различие между ними состоит в том, что если вы хотите предоставить свою директиву открытый API, поэтому другие директивы могут связываться с ним через require, тогда вы должны использовать this.something в контроллере.

Смежные вопросы