Angular JS - ng-change没有被触发



>我创建了一个指令,用于显示X以及用于清除文本框内数据的文本框,

指令 JS

angular.module(appName).directive('clrTxt', function () {
return {
restrict: 'E',
replace: true,
scope: {
cntrlas: '=',
mdlval: '='
},
link: function (scope, elem, attrs, ctrl) {
scope.cleartxt = function () {
scope.cntrlas[scope.mdlval] = '';
}
},
template: '<button class="close-icon" type="reset" id="closeicon" ng-click="cleartxt()" ><img src="/resources/img/quote-tool-close.png" class="clear-icon"></button>'
};
});

.HTML

<input type="text" ng-model="item.epinNumber" ng-change="numberLengthCheck(item)" >
<clr-txt cntrlas="item" mdlval="'epinNumber'"></clr-txt>

这将在文本框的末尾创建一个X图标,并在您单击它时清除数据。

问题是,我正在触发一个函数on-change,所以当点击X图标时,数据将被清除,所以理想情况下。 应触发更改事件。但由于某种原因,使用X指令清除数据时不会触发更改事件。

关键点是设置bindToControllercontrollerAs别名,然后就可以访问指令链接函数中的控制器功能了。

angular.module('plunker', []);
function MainCtrl($scope) {
$scope.name = 'Test';
$scope.numberLengthCheck = function(n){
alert('change triggered '+ n);
};
}

angular.module('plunker').directive('clrTxt', function(){
return {        
restrict: 'E',
controller: 'MainCtrl',
controllerAs: 'vm',
bindToController: true,
scope: {
cntrlas: '='
},
templateUrl: 'reverse_template.html',
replace: true,
link: function(scope, elem, attr, ctrls) {
scope.cleartxt = function () {
scope.cntrlas = '';
scope.numberLengthCheck(scope.cntrlas);
}
}
};
});

ng-change中,当值变化来自模型时,不会计算表达式。如果你想听模型$watch是有用的

在这里,我认为无需向clrTxt指令发送额外的属性(cntrlas,mdlval(。您可以通过默认scope:false来访问 in 指令中的父范围。

指令 JS

app.directive('clrTxt', function () {
return {
restrict: 'E',
replace: true,
template: '<button type="reset" ng-click="cleartxt()" >X</button>',
link: function (scope, elem, attrs, ctrl) {
scope.cleartxt = function () {
scope.item.epinNumber = '';
}
}
};
});

控制器 JS

app.controller('MainCtrl', function($scope) {
$scope.$watch('item.epinNumber', function(newvalue,oldvalue) {
console.log('new value is ='+newvalue+ ' and old value is ='+oldvalue);
});
});

.HTML

<body ng-controller="MainCtrl">
<input type="text" ng-model="item.epinNumber">
<clr-txt ></clr-txt>
{{item.epinNumber}}
</body>

这是工作 plunker 链接

最新更新