setViewValue в директиве при вводе не обновляет фактическое видимое значение ввода
Я боролся с этим почти два дня. Я надеюсь, что вы, ребята, можете мне помочь.
Резюме:
У меня проблемы с установкой значения представления некоторых полей ввода программно.
У меня есть форма со входами, значения которой сохраняются до удаления формы (возможно несколько элементов и несколько форм, пользователь может закрыть форму и открыть ее позже). При повторном открытии формы я хочу восстановить предыдущие значения представления (основная причина - вернуть также недействительные значения представления, которые не были сохранены в модели). Это не работает
Если я вызываю 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>
Я надеюсь, что вы, ребята, можете объяснить мне, почему это не работает и как это исправить...
2 ответа
Вам нужно позвонить ngModel.$render()
чтобы изменение значения просмотра отражалось на входе. Там нет часов, созданных на $viewValue
так что изменения автоматически отражаются.
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);
Однако вы можете переопределить и настроить свою реализацию для $render
также..
Попробуйте scope.$apply(), чтобы вызвать изменение в модели, так как вам нравится изменять модель вне области, в которой было инициировано ngModel.