7

Я видел много таких вопросов, но не нашел решения, которое работает. вот скрипка, которая не работает, но должна.Пропустить Аргументы от директивы до функции контроллера

http://jsfiddle.net/cdparmeter/j2K7N/2/

Контроллер:

$scope.foo = function (textArray) { 
    console.log(textArray) 
}; 

Директива:

return { 
    restrict: 'E', 
    replace: 'true', 
    scope: { 
     methodToCall: '&method' 
    }, 
    template: "<div> 
     <input ng-model='textToPush'/> 
     <button ng-click='pushText'>Push</button> 
     <button ng-click='finish'>Finish</button> 
    </div>", 
    link: function (scope, element, attrs) { 
     scope.paragraphs = []; 
     scope.pushText = function() { 
      scope.paragraphs.push(scope.pushText); 
      scope.pushText = ""; 
     } 
     scope.finish = function() { 
      scope.methodToCall(scope.paragraphs) 
     } 
    } 
} 

HTML:

<div ng-app="MyApp"> 
    <div ng-controller="MyController"> 
     <container data-method="foo"> 
    </div> 
</div> 

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

ответ

12

Прежде чем ответить на ваш вопрос, я должен сказать, что ваш сценарий содержит несколько ошибок:

  1. Вы связывающую вход в переменную под названием textToPush, а затем, используя другую внутри функции pushText (pushText) ;
  2. Вы не устанавливаете директиву ng-click правильно; он должен быть ng-click="pushText()" вместо ng-click="pushText". То же самое для finish;

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

scope.finish = function() { 
    var func = scope.methodToCall();     
    func(scope.paragraphs); 
} 

Вот working version вашего сценария.

Вы также мог бы это сделать, если вы предпочитаете:

scope.finish = function() { 
    scope.methodToCall({value: scope.paragraphs});         
} 

Но для этого кода, чтобы работать, вы должны изменить разметку:

<container data-method="foo(value)"/> 

Вот another jsFiddle показывает решение выше.

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