Вот соответствующий JSFiddleAngularJS Директива переменных Область применения неопределенными
https://jsfiddle.net/9Ltyru6a/3/
В скрипку, я создал контроллер и директиву, которую я хочу использовать для вызова обратного вызова всякий раз, когда значение изменения. Я знаю, что у Angular есть директива ng-change, но я хочу нечто более похожее на стандартное событие onchange (которое запускается один раз, когда поле размыто).
Контроллер:
var Controllers;
(function (Controllers) {
var MyCtrl = (function() {
function MyCtrl($scope) {
$scope.vm = this;
}
MyCtrl.prototype.callback = function (newValue) {
alert(newValue);
};
return MyCtrl;
})();
Controllers.MyCtrl = MyCtrl;
})(Controllers || (Controllers = {}));
Директива:
var Directives;
(function (Directives) {
function OnChange() {
var directive = {};
directive.restrict = "A";
directive.scope = {
onchange: '&'
};
directive.link = function (scope, elm) {
scope.$watch('onChange', function (nVal) {
elm.val(nVal);
});
elm.bind('blur', function() {
var currentValue = elm.val();
scope.$apply(function() {
scope.onchange({ newValue: currentValue });
});
});
};
return directive;
}
Directives.OnChange = OnChange;
})(Directives || (Directives = {}));
HTML:
<body ng-app="app" style="overflow: hidden;">
<div ng-controller="MyCtrl">
<button ng-click="vm.callback('Works')">Test</button>
<input onchange="vm.callback(newValue)"></input>
</div>
</body>
Кнопка работает, так что я могу с уверенностью сказать (я думаю), что контроллер прекрасно. Однако, когда я изменяю значение поля ввода и не фокусируется, я получаю сообщение об ошибке «vm is undefined».
Спасибо за помощь!
Почему вы просто не используете 'ng-blur'? https://docs.angularjs.org/api/ng/directive/ngBlur#!/ – Claies
Это определенно вариант, но в конечном итоге я хочу инкапсулировать логику проверки того, действительно ли значение изменилось в этой директиве. –
Я не уверен, что вы имеете в виду? Угловой может справиться с грязной проверкой и для вас ... – Claies