index.html
是:
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="js/angular.js" type="text/javascript"></script>
<script src="js/app.js" type="text/javascript"></script>
</head>
<body>
<div>TODO write content </div>
<input test type="text" ng-model="name" >
<h1>name: {{name}}</h1>
</body>
</html>
app.js
是:
var app = angular.module('myApp', []);
app.directive('test', function () {
return {
require: '?ngModel',
link: function ($scope, $element, $attr, controller) {
if (!controller) {
console.log("controller of ngModel not found");
return;
} else {
console.log("controller of ngModel found");
controller.$setViewValue('qwerty');
}
}
};
});
在link
函数的上述示例中,我使用controller
中指定的ngModel
选项访问require
指令的DDO
。然后使用该对象,我正在更新name
的值,这会在<h1>name: {{name}}</h1>
内更新index.html
,但<input test type="text" ng-model="name">
内index.html
内也不会更新{{1}}。为什么它在一个地方更新而在另一个地方没有?
代码@ plnkr.co
答案 0 :(得分:1)
来自角度来源:
同样重要的是要注意
$setViewValue
不会打电话$render
或以任何方式更改控件的DOM值。如果我们想 以编程方式更改控件的DOM值,我们应该更新ngModel
范围表达式。
在此示例中,您可以:$parse($attr.ngModel).assign($scope, 'qwerty')
答案 1 :(得分:1)
$ setViewValue不会直接更新$ modelValue,您需要触发$render()
控制器上的ngModel
功能,该功能会将$viewValue
传递给$modelValue
&amp;因此,您将获得页面上的绑定。
<强>指令强>
app.directive('test', function () {
return {
require: '?ngModel',
link: function ($scope, $element, $attr, controller) {
if (!controller) {
console.log("controller of ngModel not found");
return;
} else {
console.log("controller of ngModel found");
controller.$setViewValue('qwerty');
controller.$render(); //to update $modelValue
}
}
};
});