Директива AngularJS, связывающая функцию с несколькими аргументами
У меня возникла проблема с привязкой функции, определенной в контроллере, с функцией обратного вызова в директиве. Мой код выглядит следующим образом:
В моем контроллере:
$scope.handleDrop = function ( elementId, file ) {
console.log( 'handleDrop called' );
}
Тогда моя директива:
.directive( 'myDirective', function () {
return {
scope: {
onDrop: '&'
},
link: function(scope, elem, attrs) {
var myFile, elemId = [...]
scope.onDrop(elemId, myFile);
}
} );
И на моей странице html:
<my-directive on-drop="handleDrop"></my-directive>
Не повезло с приведенным выше кодом. Из того, что я читал в различных учебниках, я понимаю, что я должен указать аргументы на странице HTML?
Ответы
Ответ 1
В вашем коде есть одна небольшая ошибка, попробуйте код ниже, и он должен работать для вас.
<!doctype html>
<html ng-app="test">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js"></script>
</head>
<body ng-controller="test" >
<!-- tabs -->
<div my-directive on-drop="handleDrop(elementId,file)"></div>
<script>
var app = angular.module('test', []);
app.directive('myDirective', function () {
return {
scope: {
onDrop: '&'
},
link: function (scope, elem, attrs) {
var elementId = 123;
var file = 124;
scope.onDrop({elementId:'123',file:'125'});
}
}
});
app.controller('test', function ($scope) {
alert("inside test");
$scope.handleDrop = function (elementId, file) {
alert(file);
}
});
</script>
</body>
</html>
Ответ 2
Альтернативный метод, который выживет при минимизации
оставьте свой html как есть:
<my-directive on-drop="handleDrop"></my-directive>
измените вызов на:
scope.onDrop()('123','125')
обратите внимание на дополнительные открывающие и закрывающие круглые скобки, присвоенные onDrop. Это создаст экземпляр функции вместо ввода кода функции.
Почему это лучше
-
изменение имен параметров в определении handleDrop() (или даже добавление еще нескольких, если вы справляетесь с этим правильно) не заставит вас изменять каждую из директивных инъекций в html. много DRYer.
-
как @TrueМы предположим, что я почти уверен, что другие решения не выживут, а этот код останется с максимальной гибкостью и не является агностиком.
другой личной причиной является синтаксис объекта, который заставляет меня писать гораздо больше кода:
functionName({xName: x, yName: y})
(и добавление сигнатуры функции в каждый директивный вызов)
как против
functionName()(x,y)
(нулевое обслуживание для вашего html)
я нашел это отличное решение здесь.
надеюсь, что это поможет!