2014-11-04 12 views
7

1.3 sürümü beta sürümü kullanıyorum ve şimdi 1.3.1 sürümüne geçtikten sonra, daha önce görüntülenen tüm sürümleri kontrol ederek görebildiğim bir sorunun farkına varmış gibi görünüyor 1.3 .0 rc1.ngChange ile ilgili sorunlar, <select> için, 1.3.0 rc0

bu gibi bir kod var: Form oldu ilk görüntülendiğinde

<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> 

öncesinde ng-değişimdi RC1 değil kovuluyor. Şimdi undefined bir home.modal.topicId ile ateş ediliyor. Bu benim için kırıcı bir değişim ancak kırılma değişim bölümünde bahsedilmiyor ve henüz fark edilmeyen bir hata olup olmadığını merak ediyorum.

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) 

Benim burada fark yeni bir işlevdir: Ben Değişiklik günlüğü farklılıkları baktığımızda bu fonksiyonun herhangi bir söz bulamıyorum

tanıtılıyor writeToModelIfNeeded İşte

üretilen yığın izlemesi Tüm değişiklikleri ve satır numaralarını kontrol ettiğimde.

Bu konuda bazı tavsiyelerde bulunmak istiyorum. Öncelikle writeToModelIfNeeded eklenmesine neden olan değişikliği bulmak mümkün, sonra ikinci olarak bu seçim kutusu için doğru işlevdir. Bütün düşüncenin, ng-değişikliğinin sadece model değeri tanımlanmışsa ateşleneceğini düşündüm. Başvuru için

burada bu yaparak sorunu yeniden başardı 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

Eğer bir jsfiddle oluşturarak denediniz yangın neden 1.2x ve 1.3x için bir geçiş mi? – John

+3

Bu sorunu çoğaltamıyorum, ** [bu filme bakın] (http://plnkr.co/edit/KMIOZx7pV4OYmhk1XayE?p=preview) **. Sorunu yeniden üreten bu plunker'ın değiştirilmiş bir sürümünü paylaşmak ister misiniz? Teşekkürler! – Josep

+0

Bu plunker'a bakacağım ve bu uygulama ile benimki arasındaki farklılıkları bulabileceğimi göreceğim. Teşekkürler –

cevap

5

ile eklenmiş gibi görünüyor yeni kod alandır. aynı şey emin değilim gerçi Denetleyicinizi görmeden:

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

Ne oluyor burada açısal boş tanımlanmayan sonucuna varsayılan setleri bunu geçersiz bir değerdir söylüyor olmasıdır. Sen 'tanımsız' olarak ayarlayarak ya da html bu ekleyerek düzeltebilirsiniz:

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

de test Josep plunker ve ayrıca null o değerini değiştirerek ngChange