2014-09-08 2 views
1

Я пытаюсь передать функцию от контроллера к директиве, поэтому событие, инициированное директивой, может вызвать обновление в другом контроллере.Проблемы с передачей обратного вызова с контроллера на директиву

controllers.controller('UserCtrl', function ($scope) { 
    $scope.name="Name"; 
    $scope.test = function (t) { 
    console.log("Inside "+t+" "+$scope.name) 
    return $scope.test2(); 
    }; 
    $scope.test2 = function(){ 
    return 2; 
    } 
} 

<my-test-directive respond="test"> 

Это, кажется, работает нормально, но когда я изменить его, чтобы попытаться соответствовать Google Angular conventions я получаю неопределенную ошибку при возврате this.test2();. Вот plunker с неудачной версией.

Использование «Google Angular style», как бы я справился с этим?

ответ

2

Пожалуйста, смотрите здесь: http://plnkr.co/edit/Mugs2C7UOjlXx1L3LsMP?p=preview

Вам нужно изменить несколько вещей :

  1. Для вызова функции из директивы следует использовать «&» вместо «=»
  2. В вашем изменения HTML respond="userController.test" в respond="userController.test(msg)"
  3. Наконец, вы должны передавать объект функционировать вместо внесения изменений строки scope.respond("So I should be getting inside"); в scope.respond({msg:"So I should be getting inside"})

Я надеюсь, что это поможет.

+0

Будет ли это работать с IE8, то это актуальная забота моего – Jackie

2

Когда вы передаете функцию в javascript, контекст функции теряется, поэтому клавиатура this больше не будет работать. Если вы хотите передать свою тестовую функцию, вам нужно обернуть ее в функцию, привязанную к userCtrl. Вы можете сделать это с bind(), добавив следующую строку в конструктор вашего контроллера и передачи boundTest к вашей директивы вместо test

this.boundTest = this.test.bind(this); 

Обратите внимание, что bind() был введен в ES5, поэтому он не будет работать в IE8

Вот рабочая plunker http://plnkr.co/edit/BTuwTFf2XsmrR3As4x1x?p=preview

+0

Я получаю, откуда вы пришли, и я думаю, что вы правы. Я, однако, придумал то, что я считаю немного более чистым ответом. Собираюсь оставить это и позволить сообществу повышать более точный ответ, потому что честно, я не уверен :-) – Jackie

+0

На самом деле, по-моему, я люблю тебя лучше! Благодаря! – Jackie

+1

ха-ха, да, это немного взломать, и я хочу, чтобы Angular/javascript справлялся с этой ситуацией лучше. Я думаю, что ответ sss был бы официально рекомендован Angular, но я просто ненавижу синтаксис атрибутов '&'. Вы только должны выбрать меньшее из 3 зол;) – rob

0

Вот what I came up with

Благодаря обокрасть за идею, я не знаю, что мне нравится это, хотя по двум причинам ...

1.) Я не могу использовать прототип, ограничив мой варианты наследования (как я понимаю) 2.) Это выглядит довольно Hacky

$scope.userController.test2(); 

в зависимости от подсчета голосов и комментариев будет зависеть то, что я отмечаю, как ответ, так пожалуйста, обеспечить обратную связь

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