我已经和他打了差不多两天了。我希望你们能帮助我。
要点:
我在以编程方式设置某些输入字段的视图值时遇到问题
我有一个带有输入的表单,其值在表单被删除之前保存(多个元素和多个表单可能,用户可能关闭表单,稍后重新打开)。在重新打开表单时,我想恢复以前的视图值(主要原因是还要返回未保存在模型中的无效视图值)。这不起作用。
如果我调用ctrl。$ setViewValue(previousValue)我得到模型(可见)更新(如果有效),formControl的视图值(在控制台中调试时)也会改变,但我不会得到它们实际上是在输入字段中呈现的。我不明白为什么:(
我把问题简化为这个小提琴:
http://jsfiddle.net/g0mjk750/1/
的javascript
var app = angular.module('App', [])
function Controller($scope) {
$scope.form = {
userContent: 'initial content'
}
}
app.controller('Controller', Controller);
app.directive('resetOnBlur', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
element.bind('blur', function () {
console.log(ngModel);
scope.$apply(setAnotherValue);
});
function setAnotherValue() {
ngModel.$setViewValue("I'm a new value of the model. I've been set using the setViewValue method");
}
}
};
});
Html
<form name="myForm" ng-app="App" ng-controller="Controller" class="form">
Text: {{form.userContent}}
<hr />
If you remove the text, "Required!" will be displayed.<br/>
If you change the input value, the text will update.<br/>
If you blur, the text will update, but the (visible) input value not.
<hr />
<input class="input" type="text" ng-model="form.userContent" name="userContent" reset-on-blur required></textarea>
<span ng-show="myForm.userContent.$error.required">Required!</span>
</form>
我希望你们能向我解释为什么这不起作用以及如何解决这个问题......
答案 0 :(得分:77)
您需要调用ngModel.$render()
以使输入中反映出viewvalue更改。 <{1}}上没有创建监视,因此会自动反映更改。
$viewValue
<强> Plnkr 强>
function setAnotherValue() {
ngModel.$setViewValue("I'm a new value of the model. I've been set using the setViewValue method");
ngModel.$render();
}
的默认实现可以做到这一点: -
$render
但是,您也可以覆盖和自定义 element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
的实施。
答案 1 :(得分:-3)
尝试使用范围。$ apply()来调用模型上的更改,因为您喜欢在ngModel所在的范围之外更改模型