2015-06-22 3 views
0

В AngularJS вы можете сделать кнопку, чтобы вызвать действие, как это:Как вызвать действие пользовательской директивы в AngularJS?

<div ng-controller="myController"> 
    <button ng-click="onButtonClicked()">Click me</button> 
</div> 

Итак, я вставить пользовательскую директиву так:

и в связи функции I my-canvas.js ДИРЕКТИВА файла замените тег на холст KineticJS. Затем пользователь манипулирует холстом, перетаскивая фигуры Kinetic и, наконец, когда пользователь делает с фигурами то, что он должен делать, я хочу, чтобы директива вызывала действие, определенное на myController. Я думаю о чем-то вроде этого:

<div ng-controller="myController"> 
    <my-canvas ng-success="onScenarioSuccess" /> 
</div> 

но я не могу понять, как правильно это сделать.

Как я могу сделать директиву, чтобы вызвать ее действие/событие программно?

ответ

0

Если вы хотите, чтобы ваша директива открывала API для привязки к поведению, вы должны использовать область изоляции и использовать локальную область видимости &. Это позволяет вам передать функцию, которую может вызывать директива. Вот простой пример:

.directive('testDirective', function() { 
    return { 
     restrict: 'E', 
     scope: { 
      action: '&' 
     }, 
     template: '<button ng-click="action()">Test</button>' 
    }; 
}); 

И использовать его как:

<test-directive action="myControllerFunction()"></test-directive> 

Согласно документации:

& связывание позволяет директива, чтобы вызвать оценку того или иного выражения в контекст первоначальной сферы действия в определенное время. Любое юридическое выражение разрешено, включая выражение, которое содержит вызов функции. Из-за этого привязки & идеально подходят для функций обратного вызова для директивного поведения.

В разделе documentation содержится более подробная информация.

0

Если вы хотите открыть собственное событие, например ng-success, и хотите вызвать функцию в событии. Вы можете либо сделать то, что @Beyers упомянул, используя изолированную область.

Или посмотрите исходный код ng-click, он просто обертывает событие javascript внутри $ scope.apply, используя службу $parse для оценки переданного им выражения. Что-то вроде этого можно добавить в вашу функцию связи

var fn = $parse(attr['ngSuccess']); 
element.on('someEvent', function (event) { 
    var callback = function() { 
     fn(scope, { 
      $event: event 
     }); 
    }; 
    scope.$apply(callback); 
}); 

Преимущество этого механизма в том, что изолированная область не создана.

+0

Почему это преимущество? Что я теряю, используя изолированную область? –

+0

Изолированные области могут стать более сложными для управления, когда у них есть внутренний html. Если внутренний html происходит от родителя (ng-transclude), он принимает родительскую область. Во внутреннем html - это шаблон html директивы, тогда он принимает изолированную область. Изолированные области имеют смысл, когда вы создаете свою директиву как компонент, который имеет свой собственный интерфейс. Если вы делаете то же самое, вы можете продолжать использовать изолированную область. – Chandermani

+0

@ErikEscobedo вы ничего не теряете, используя изолированный объем, на самом деле вы получаете совсем немного. Изолированная область - все о возможности повторного использования, другими словами директива не полагается на родительскую область для работы, и вы не можете случайно изменить что-либо в родительской области и т. Д. Изолированная область несколько сложнее понять сначала, но ИМХО - это один основных концепций, чтобы овладеть, чтобы действительно получить преимущества от директив. Есть много онлайн-материалов, посвященных этой теме, чтобы вы могли ускориться. – Beyers

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