Я использую директиву так:
.directive('inputExtended', function() {
//input with extra expression, when expression is true in right side we show success image, else we show error image
// use this directive in <form>
return {
restrict: 'E',
templateUrl: 'templates/input-extended.html',
replace: true,
scope: {
success: '=success',
error: '=error',
inputModel: '=inputModel',
value: '=value',
name: '=name'
}
}
})
Я использую эту директиву следующим образом:
<input-extended name="'username'" inputModel="LoginCtrl.username" value="'username' | translate" success="!form.username.$error.required && form.username.$dirty" error="form.username.$error.required && form.username.$dirty"></input-extended>
Код директивы:
<div>
<input ng-click="test()" type="text" name="{{name}}" ng-model="inputModel" placeholder="{{value}}" required />
<div class="error" ng-if="error">
<img src="../img/error.png">
</div>
<div class="success" ng-if="success">
<img src="../img/success.png">
</div>
Но когда я использую эту директиву, для указания углового не отправляйте оригинальную ссылку на LoginCtrl.username. Как отправить оригинальную ссылку?
Делая это:
scope: {
success: '=success',
error: '=error',
inputModel: '=inputModel',
value: '=value',
name: '=name'
}
Вы создаете новую изолированную область, которая копирует объекты и добавляет часы в обе области (родительский и дочерний) для обработки двунаправленной привязки.
К сожалению, вы не можете передать ссылку своего объекта на новую изолированную область. Что вы можете сделать, это сохранение переменной в службе, а затем предоставление вашей директивы некоторым параметрам для получения переменной.
например:
директива:
service-name="loginService" service-method="getLoginInfo"
добавьте это в свой объем:
scope: {
success: '=success',
error: '=error',
inputModel: '=inputModel',
value: '=value',
name: '=name'
serviceName: '@',
serviceMethod: '@'
}
И затем, в контроллер:
return {
restrict: 'E',
templateUrl: 'templates/input-extended.html',
replace: true,
scope: {
//
},
controller: ["$injector", function($injector){
var service = $injector.get($scope.serviceName);
$scope.someObject = service[$scope.serviceMethod]();
}]
};
но мне это совсем не нравится.