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);
}
});
};
Haben Sie versucht, einen jsfiddle Erstellen mit ein Toggle für 1.2x und 1.3x? – John
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
Ich werde in diesen Plünderer schauen und sehen, ob ich die Unterschiede zwischen dieser Implementierung und meiner finden kann. Danke –