我注意到如果我手动更改input2的值然后更改input1的值,输入2的值将不再更新,为什么?是否说如果用户在其中输入内容,单向绑定将在输入的形式中被打破?
<div ng-controller="myCtrl">
1: <input name="input1" ng-model="topValue"/>
2: <input name="input2" value="{{topValue}}"/>
topValue: <span>{{topValue}}</span>
</div>
答案 0 :(得分:1)
ngValue
不支持 input[text]
来自ngValue docs:
将给定表达式绑定到 input [select] 或 input [radio] 的值,以便在选择元素时,设置该元素的ngModel到了界限值。
我在使用input[text]
时调试了ngValue:
ngValueDirective
(input.js)attr.$set('value',value);
仅更改内部编辑器(见下文)elm[0].value = value || "";
并且有效:
var ngValueDirective = function() {
return {
priority: 100,
compile: function(tpl, tplAttr) {
if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
return function ngValueConstantLink(scope, elm, attr) {
attr.$set('value', scope.$eval(attr.ngValue));
};
} else {
return function ngValueLink(scope, elm, attr) {
scope.$watch(attr.ngValue, function valueWatchAction(value) {
//attr.$set('value', value);
elm[0].value = value || "";
});
};
}
}
};
};
value
(或任何其他属性)进行插值时:$observe
函数(compile.js)addAttrInterpolateDirective
$observe
回调时,它使用attr.$set(name, newValue)
,同样的问题; ngValue
指令。答案 1 :(得分:0)
是。当用户编辑input2的值时,input2的值不再是angularjs可以理解的表达式,因此不会反映对 topValue 的更改。
答案 2 :(得分:0)
简短版本:绑定有效。
长版:
元素的属性与其属性之间存在差异。对于input
元素的属性尤其如此。
value
属性是元素的初始或默认值。只要您在input
字段中输入内容,value
就不再重要了。
因此,当您使用value="{{topValue}}"
之类的角度表达式时,只要表达式{{topValue}}
发生变化,属性的值就会发生变化。但是,只要您更改input
字段的内容,它就无关紧要了。通过设置value
元素的input
属性,手动或甚至以编程方式。