2014-10-01 7 views
23

Walczyłem z tym przez prawie dwa dni. Mam nadzieję, że mi pomożesz.setViewValue w dyrektywie na wejściu nie aktualizuje rzeczywistej widocznej wartości wejściowej

Podsumowanie:
Mam problemy z programowym ustawieniem wartości widoku niektórych pól wejściowych.
Mam formularz z wejściami, których wartości są zapisywane przed usunięciem formularza (możliwe jest użycie wielu elementów i wielu formularzy, użytkownik może zamknąć formularz i ponownie go otworzyć). Przy ponownym otwarciu formularza chcę przywrócić poprzednie wartości widoku (głównym powodem jest odzyskanie nieprawidłowych wartości widoku, które nie zostały zapisane w modelu). To nie działa.

Jeśli zadzwonię ctrl. $ SetViewValue (previousValue) Otrzymuję model (widocznie) zaktualizowany (jeśli jest prawidłowy), zmieniono również wartości widoku formControl (podczas debugowania w konsoli), ale ich nie otrzymuję faktycznie renderowane w polach wejściowych. Nie rozumiem dlaczego :(

I zmniejszona problem do tego ryba:
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> 

Mam nadzieję, że chłopaki mogą wyjaśnić mi dlaczego to nie działa i jak to naprawić ...

Odpowiedz

63

Należy wywołać ngModel.$render(), aby zmiana wartości widoku została odzwierciedlona na wejściu. Nie ma zegarka utworzonego na $viewValue, więc zmiany są automatycznie odzwierciedlane.

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

Plnkr

Domyślna implementacja $render robi to: -

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

Można jednak przesłonić i dostosować realizację dla $render jak dobrze ..

+2

Tak łatwo. dzwoń $ render i działa. to super. ale naprawdę muszę nadpisać $ render, ponieważ w 1.3.0-rc.3 $ render() wygląda prawie tak samo, ale sprawdza $ isEmpty (ctrl. $ modelValue), a nie $ isEmpty (ctrl. $ viewValue). No iw setViewValue wartość modelValue jest ustawiona tylko wtedy, gdy jest prawidłowa. ale chciałem również, aby niepoprawne pola również zostały zwrócone. Bez nadpisywania renderowania, aby zachowywał się tak jak kiedyś (jak w Twojej odpowiedzi) moje pola są puste. Na razie przesłoniłem metodę renderowania. Zastanawiam się, dlaczego zmienili metodę renderowania. – Allisone

-3

spróbować zakresu. $ apply(), aby wywołać zmianę w modelu, ponieważ lubisz zmieniać model poza zakresem, w którym ngModel był wprowadzany

+0

'scope. $ Apply()' nie działa dla mnie. Wywołanie $ setViewValue (...) Wydaje mi się, że już odpala to, co robi obowiązujące $, od kiedy zadzwonię do $ setViewValue zegarki na tym modelu zgasną. – Jerinaw