2015-05-15 3 views
0

Я пытаюсь понять, как включить область действия с директивой, которую я добавляю к dom в событии click в контроллере.Как включить данные/область с контроллера в динамически добавленную директиву?

Шаг 1. На событие щелчка, вызвать функцию в мой контроллер, который добавляет директиву, как этот

$scope.addMyDirective = function(e, instanceOfAnObjectPassedInClickEvent){ 
    $(e.currentTarget).append($compile("<my-directive mydata='instanceOfAnObjectPassedInClickEvent'/>")($scope)); 

} 
    //I'm trying to take the `instanceOfAnObjectPassedInClickEvent` and make it available in the directive through `mydata` 

выше, часть из которых я получил from this SO answer, успешно добавляет директиву (и директивы имеет шаблон, который добавляется в dom), однако внутри директивы я не могу получить доступ к каким-либо данным области mydata, это говорит о том, что это undefined.

Моя директива

app.directive('myDirective', function(){ 

    return { 
     restrict: 'AE', 
     scope: { 
     mydata: '=' 
     //also doesn't work if I do mydata: '@' 
     }, 
     template: '<div class="blah">yippee</div>', 
     link: function(scope,elem,attrs) { 
       console.log(scope) //inspecting scope shows that mydata is undefined 
     } 
    } 
} 

Update Я изменил имя datafromclickedscope в OP, чтобы сделать его более ясным. В действии контроллера addMyDirective (см. Выше) instanceOfAnObjectPassedInClickEvent - это экземпляр объекта, переданного в метод контроллера, в событие щелчка, которое я пытаюсь передать в директиву как mydata='instanceOfAnObjectPassedInClickEvent'. Однако, даже если я изменяю = на @ в директиве, и я пытаюсь получить доступ к scope.mydata в функции ссылки директивы, он просто показывает строку, подобную этой "instanceOfAnObjectPassedInClickEvent", а не фактические данные объекта, доступные мне в моем методе который обрабатывает событие click

+0

Я предполагаю, что 'datafromclickedscope' это ключ, который будет использоваться для ссылки на значение на' $ scope'? Подобно '$ scope.hello =" World "; $ scope.addMyDirective (событие, «привет»); 'и вы ожидаете' 'World '' в директиве? В противном случае, если вы хотите получить «привет», ваш 'mydata: '='' должен быть 'mydata: '@'' – DRobinson

+0

@DRobinson. Я изменил имя «datafromclickedscope» в OP, чтобы сделать его более понятным. Это 'instanceOfAnObjectPassedInClickEvent', который я хочу передать в директиву. Однако, даже если я изменяю '=' на '@', и я пытаюсь получить доступ к @ scope.mydata в директиве, он просто показывает строку, подобную этой '" instanceOfAnObjectPassedInClickEvent ", а не фактические данные объекта, которые доступны мне в мой метод, который обрабатывает событие click – Leahcim

ответ

1

При использовании mydata='instanceOfAnObjectPassedInClickEvent' в шаблоне необходимо, чтобы instanceOfAnObjectPassedInClickEvent был определен в $ scope. Поэтому перед компиляцией вы должны назначить переменную в $ scope. Я переименую эту переменную в код ниже, так что те же имена не будут вас путать, и было бы ясно, что формальный параметр функции не может быть виден в шаблоне.

$scope.addMyDirective = function(e, instanceOfAnObjectPassedInClickEvent){ 
    $scope.myEvent = instanceOfAnObjectPassedInClickEvent; 
    $(e.currentTarget).append($compile("<my-directive mydata='myEvent'/>")($scope)); 
} 

EDIT: слегка адаптированный jsfiddleне используя JQuery не манипулировать DOM

+0

Спасибо, что он работает в том, что я могу получить доступ к mydata в директиве как scope.mydata (но мне нужно запустить его через JSON.parse (scope.mydata)], однако шаблон, который добавляется моим директива немного сложнее, чем в OP, она имеет событие ng-click I, которое предполагает запуск триггера на контроллере. Однако, если я нажму на него, он не активирует функциюDoes, которая означает, что $ scope не является включается, когда I $ компилирует шаблон? -не уверен, что эта проблема связана с оригинальным вопросом или если я должен опубликовать другой вопрос. – Leahcim

+0

Когда я нажимаю ссылку на ваш jsfiiddle, она просто забирает меня на страницу входа – Leahcim

+0

Извините за неработающую ссылку. Исправлено: –

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