Подтвердить что ты не робот

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>

Надеюсь, вы, ребята, можете объяснить мне, почему это не работает и как это исправить...

4b9b3361

Ответ 1

Вам нужно позвонить ngModel.$render(), чтобы на дисплее появилось изменение значения viewvalue. Нет часов, созданных на $viewValue, чтобы изменения автоматически отражались.

   function setAnotherValue() {
        ngModel.$setViewValue("I'm a new value of the model. I've been set using the setViewValue method");
        ngModel.$render();
    }

Plnkr

Реализация по умолчанию $render выполняет следующее: -

 element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);

Однако вы можете переопределить и настроить свою реализацию для $render, а также.

Ответ 2

$ apply() для вызова изменений в модели, поскольку вам нравится изменять модель за пределами области действия, где ngModel была введена