2014-11-04 7 views
7

Ich habe eine Beta-Version von 1.3 verwendet und jetzt nach dem Verschieben auf 1.3.1 bemerke ich ein Problem, das durch Überprüfen aller früheren Versionen scheint, dass es in gestartet wurde 1.3 .0 rc1.Probleme mit ngChange für <select> nach 1.3.0 rc0

I-Code wie diese:

<select ng-model="home.modal.topicId" 
     ng-change="ctrl.modalTopicChanged()" 
     ng-options="item.id as item.name for item in home.modal.option.topics.data" 
     ng-required="true"> 
     <option style="display: none;" value="">Select Topic</option> 
</select> 

Vor dem ng Wechsel war RC1 nicht wird ausgelöst, wenn die Form war erste angezeigt. Jetzt wird es mit einer home.modal.topicId von undefined gefeuert. Dies ist eine bahnbrechende Veränderung für mich, aber es wird nicht im Abschnitt über die Änderung der Änderungen erwähnt, und ich frage mich, ob es sich um einen Fehler handelt, der noch bemerkt werden muss. Hier

ist der Stack-Trace erzeugt:

TypeError: Cannot read property 'dataMap' of undefined 
    at AdminProblemController.modalTopicChanged (http://127.0.0.1:17315/Content/app/admin/controllers/ProblemController.js:109:114) 
    at $parseFunctionCall (http://127.0.0.1:17315/Scripts/angular.js:11387:18) 
    at Scope.$get.Scope.$eval (http://127.0.0.1:17315/Scripts/angular.js:13276:28) 
    at http://127.0.0.1:17315/Scripts/angular.js:19888:13 
    at http://127.0.0.1:17315/Scripts/angular.js:19499:9 
    at forEach (http://127.0.0.1:17315/Scripts/angular.js:331:20) 
    at $$writeModelToScope (http://127.0.0.1:17315/Scripts/angular.js:19497:5) 
    at writeToModelIfNeeded (http://127.0.0.1:17315/Scripts/angular.js:19490:14) 
    at http://127.0.0.1:17315/Scripts/angular.js:19484:9 
    at validationDone (http://127.0.0.1:17315/Scripts/angular.js:19420:9) 

Was ich bemerke hier ist eine neue Funktion: writeToModelIfNeeded

Wenn ich die Änderungsprotokoll Unterschiede sehe ich keine Erwähnung dieser Funktion finden kann eingeführt werden wenn ich alle Änderungen und die Zeilennummern überprüfe.

Ich möchte dazu einen Rat bekommen. Erstens ist es möglich, die Änderung zu finden, die das Hinzufügen von writeToModelIfNeeded verursacht hat, und zweitens ist dies die korrekte Funktionalität für die Auswahlbox. Ich dachte, die ganze Idee wäre, dass die ng-Änderung nur ausgelöst würde, wenn der Modellwert definiert wäre.

Als Referenz ist hier der Bereich des neuen Code, indem Sie diese mit 1.3.0 rc.1

** 
    * @ngdoc method 
    * @name ngModel.NgModelController#$commitViewValue 
    * 
    * @description 
    * Commit a pending update to the `$modelValue`. 
    * 
    * Updates may be pending by a debounced event or because the input is waiting for a some future 
    * event defined in `ng-model-options`. this method is rarely needed as `NgModelController` 
    * usually handles calling this in response to input events. 
    */ 
    this.$commitViewValue = function() { 
    var viewValue = ctrl.$viewValue; 

    $timeout.cancel(pendingDebounce); 

    // If the view value has not changed then we should just exit, except in the case where there is 
    // a native validator on the element. In this case the validation state may have changed even though 
    // the viewValue has stayed empty. 
    if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) { 
     return; 
    } 
    ctrl.$$lastCommittedViewValue = viewValue; 

    // change to dirty 
    if (ctrl.$pristine) { 
     ctrl.$dirty = true; 
     ctrl.$pristine = false; 
     $animate.removeClass($element, PRISTINE_CLASS); 
     $animate.addClass($element, DIRTY_CLASS); 
     parentForm.$setDirty(); 
    } 
    this.$$parseAndValidate(); 
    }; 

    this.$$parseAndValidate = function() { 
    var parserValid = true, 
     viewValue = ctrl.$$lastCommittedViewValue, 
     modelValue = viewValue; 
    for(var i = 0; i < ctrl.$parsers.length; i++) { 
     modelValue = ctrl.$parsers[i](modelValue); 
     if (isUndefined(modelValue)) { 
     parserValid = false; 
     break; 
     } 
    } 
    if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) { 
     // ctrl.$modelValue has not been touched yet... 
     ctrl.$modelValue = ngModelGet(); 
    } 
    var prevModelValue = ctrl.$modelValue; 
    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid; 
    if (allowInvalid) { 
     ctrl.$modelValue = modelValue; 
     writeToModelIfNeeded(); 
    } 
    ctrl.$$runValidators(parserValid, modelValue, viewValue, function() { 
     if (!allowInvalid) { 
     ctrl.$modelValue = ctrl.$valid ? modelValue : undefined; 
     writeToModelIfNeeded(); 
     } 
    }); 

    function writeToModelIfNeeded() { 
     if (ctrl.$modelValue !== prevModelValue) { 
     ctrl.$$writeModelToScope(); 
     } 
    } 
    }; 

    this.$$writeModelToScope = function() { 
    ngModelSet(ctrl.$modelValue); 
    forEach(ctrl.$viewChangeListeners, function(listener) { 
     try { 
     listener(); 
     } catch(e) { 
     $exceptionHandler(e); 
     } 
    }); 
    }; 
+0

Haben Sie versucht, einen jsfiddle Erstellen mit ein Toggle für 1.2x und 1.3x? – John

+3

Ich kann dieses Problem nicht replizieren, ** [siehe diesen Plott] (http://plnkr.co/edit/KMIOZx7pV4OYmhk1XayE?p=preview) **. Würde es Ihnen etwas ausmachen, eine modifizierte Version dieses Plunkers zu teilen, die das Problem reproduziert? Vielen Dank! – Josep

+0

Ich werde in diesen Plünderer schauen und sehen, ob ich die Unterschiede zwischen dieser Implementierung und meiner finden kann. Danke –

Antwort

5

ich in der Lage war, hinzugefügt worden zu sein scheint, um das Problem zu reproduzieren. Ohne zu sehen, Ihren Controller nicht sicher, aber wenn elbe:

this.modal = { 
     topicId:null, 
     option:{ 
     topics:{ 
      data:[{id:1,name:'item1'},{id:2,name:'item2'}] 
     } 
     } 
    }; 

Was hier geschieht, ist, dass Winkel sagt null ist ein ungültiger Wert so standardmäßig setzt es nicht definiert. Sie können dieses Problem beheben, indem sie auf ‚undefiniert‘ oder das Hinzufügen dieser zu Ihrem HTML Einstellung:

ng-model-options="{allowInvalid:true}" 

auch getestet Josep Plunker und diesen Wert ändert sich auch auf Null verursacht ngChange Feuer

Verwandte Themen