在线代码:
http://jsfiddle.net/mb98y/309/
HTML
<div ng-app="myDirective" ng-controller="x">
<input id="angular" type="text" ng-model="data.test" my-directive>
</div>
<button onclick="document.querySelector('#angular').value = 'testg';">click</button>
JS
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(attrs.ngModel, function (v) {
//console.log('value changed, new value is: ' + v);
alert('value change: ' + scope.data.test);
});
}
};
});
function x($scope) {
//$scope.test = 'value here';
$scope.data = {
test: 'value here'
}
}
http://jsfiddle.net/mb98y/310/
HTML
<div ng-app="myDirective" ng-controller="x">
<input id="angular" type="text" my-directive="test">{{test}}</div>
<button onclick="document.querySelector('#angular').value = 'testg';">click</button>
JS
angular.module('myDirective', [])
.directive('myDirective', function () {
return {
restrict: 'A',
scope: {
myDirective: '='
},
link: function (scope, element, attrs) {
// set the initial value of the textbox
element.val(scope.myDirective);
element.data('old-value', scope.myDirective);
// detect outside changes and update our input
scope.$watch('myDirective', function (val) {
element.val(scope.myDirective);
});
// on blur, update the value in scope
element.bind('propertychange keyup change paste', function (blurEvent) {
if (element.data('old-value') != element.val()) {
console.log('value changed, new value is: ' + element.val());
scope.$apply(function () {
scope.myDirective = element.val();
element.data('old-value', element.val());
});
}
});
}
};
});
function x($scope) {
$scope.test = 'value here';
}
我想点击按钮设置输入元素值,而angularjs(ng-model或范围对象)可以得到它。
但是,document.querySelector('#angular').value = 'testg';
以这种方式更改元素值,angularjs $ watch和bind函数都不能获得值更改事件。如果你通过键盘在输入元素中输入一些单词,它们都可以工作。
如何在angularjs?
中以这种方式设置值时检测输入元素值的变化答案 0 :(得分:13)
首先,这里是双向数据绑定,以避免这种情况。
<input ng-model='ctrl.field' />
<button ng-click='ctrl.field = "new value"'>change</button>
其次,ng-change
指令与ng-model
一起使用,当模型中的值发生变化时,可以使用该指令执行某些操作。
<input ng-model='ctrl.field' ng-change='alert("changed!")' />
如果您仍想直接使用DOM更改角度以外的值,只需触发有角度收听的事件 - blur
或keypressed
<button ng-click='$("#id").val(a); $("#id").trigger("blur")'>change</button>
或
<button ng-click='angular.element("#id").val(a); angular.element("#id").trigger("blur")'>change</button>
答案 1 :(得分:2)
除非你有充分的理由,否则你不应该使用querySelector
(就像你不应该使用jQuery一样)。
您只需修改$scope.data.test
,您的文本框内容就会自动更新。为了实现这一点,您还需要button
拥有相同的控制器(因此它们共享范围),并使用ng-click
代替onclick
,如下所示:
<div ng-app="myDirective" ng-controller="x">
<input id="angular" type="text" ng-model="data.test" my-directive=""></input>
<button ng-click="data.test = 'testg';">click</button>
</div>