2016-01-10 5 views
1

Я создал пользовательскую директиву в своем приложении, которое использует D3.js. Я хочу, чтобы иметь возможность вызвать вызов API для загрузки большего количества данных, когда пользователь нажимает на узел в моей визуализации D3. Это потребует захвата данных, связанных с узлом, который был нажат, и передачи его обратно на мой контроллер. Затем контроллер обрабатывает вызов функции для получения большего количества данных.Как передать данные из директивы контроллеру

Чтобы начать работу, я просто пытаюсь зарегистрировать данные, связанные с узлом, на который пользователь щелкнул мой контроллер. Моя проблема в том, что эти данные в моем контроллере undefined.

Соответствующая директива Код:

angular.module('gameApp') 
    .directive('gmLinkAnalysis', gmLinkAnalysis); 

gmLinkAnalysis.$inject = ['$location', 'd3']; 

function gmLinkAnalysis($location, d3) { 

    var directive = { 
    restrict: 'E', 
    templateUrl: '/app/gmDataVis/gmLinkAnalysis/gmLinkAnalysis.directive.html', 
    scope: { 
     data: '=', 
     logNode: '&' 
    }, 
    link: function(scope) { 

     ... 

     function click(d) { 
     scope.logNode(d); 
     } 
    } 
    }; 
    return directive; 
} 

HTML:

<gm-link-analysis data="connections.users" log-node="connections.logNode(d)"></gm-link-analysis> 

Соответствующий код контроллера:

angular.module('gameApp') 
    .controller('ConnectionsController', ConnectionsController); 

function ConnectionsController() { 
    var vm = this; 

    ... 

    vm.logNode = function(d) { 
    console.log(d); 
    }; 
} 

Если я заменю d в моем HTML со строкой, такие как «привет мир "(log-node="connections.logNode('hello world')") он правильно зарегистрирован. Таким образом, моя проблема заключается в том, что я не передавал свои данные в качестве параметра в своем html. Как я могу это сделать?

ответ

1

Вы можете передать модель крепления некоторых методы в директиве, но я лично предпочитаю использовать $.broadcast сервис, чтобы очистить мою кодовую базу.

Директива

function click(d) { 
    $rootScope.$broadcast('someEvent', d); 
} 

Контроллер

angular.module('gameApp') 
    .controller('ConnectionsController', ConnectionsController); 

function ConnectionsController() { 
    var vm = this; 

    vm.$on('someEvent', function(event, data) { 
    console.log(data) 
    }); 
} 

Если вы все еще думаете, что проходя методы вокруг бы сделать трюк для вас, вот simple example пропускания метод директивы по модели данных

+1

$ широковещательная передача действительно удобна, но связанные с ней накладные расходы (с точки зрения дайджеста ect ..) и позже создают проблемы ремонтопригодности. НО да, это действительно работает. – heavyhorse

+0

@heavyhorse Я категорически не согласен, используя '$ broadcast', вы должны иметь только« несогласованные »события, если какое-либо из имен методов изменится в будущем. Вызов методов будет более точным, а модели данных будут менее сложными. Кроме того, легче было бы отлаживать и проверять тип. – Theodore

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