2016-04-14 11 views
1

Aşağıdaki giriş alanını vardır:Neden min özniteliği ngChange çağrılsın?

<input type="number" 
    class="menu-control validate" 
    style="width: 50px;" 
    ng-disabled="!ctrl.editable()" 
    min="1" 
    ng-change="ctrl.updateBookingPriceRequest()" 
    ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 2000, 'blur': 0 }}" 
    ng-model="extra.quantity" /> 

Sorunum dk direktifi olduğunu. Oradayken, açısal, giriş değiştirilmeden ng-değişimini sürekli olarak çağırıyor (değişimden sonra ajax araması yaptığım için iyi değil). Min'i kaldırırsam iyi çalışır ve aynı problemi max ile olmaz. Modelin başlangıçta minimale göre mi, üstünde mi olduğu önemli değil.

Yapamayacağım bir şey gören var mı?

Düzenleme: Benim değişim fonksiyonu hiçbir şey yapmadan denedim ve olmalı bu yüzden dolayı benim koduna sorunu durdu

. Ama anlamadığım şey min neden olmadan iyi çalışıyor!

this.updateBookingPriceRequest = function() { 
      _this.prices.getBookingPrice(_this.bookingPrice).then(function (response) { 
       if (response.successful) { 
        _this.bookingPrice = response.data; 
        _this.bookingPrice.mooringExtras.bookingExtras.forEach(function (extra) { 
         var feature = _this.features.filter(function (f) { return f.featureId === extra.mooringFeatureId; })[0]; 
         extra.unitOfMeasureId = feature.unitOfMeasureId; 
         extra.pricedQty = feature.pricedQuantity; 
         extra.pricingType = feature.pricingType; 
        }); 
        if (_this.bookingPrice.mooringDiscounts) { 
         _this.bookingPrice.mooringDiscounts.forEach(function (discount) { 
          discount.discountName = _this.harborDiscounts.filter(function (x) { return x.id === discount.discountModelId; })[0].name; 
         }); 
        } 
       } 
       else 
        _this.Error.showErrorMessage('Error getting booking price: ' + response.message); 
      }); 
     }; 

model özelliği işlev değiştirilir olan ilgili "ekstra" amacı ise "miktar" özelliği aynı kalır. Bu, ng değişiminin tetiklenmesine neden olabilir mi? nesneler tanımlanır (valepu tarafından yorumunu bakınız) nasıl göstermek için

Düzenleme: Bir dizide olduğu

ekstra nesne (ler) (benim giriş alanı bir yineleyici içinde olduğunu, ancak benim şimdiki testte sadece bir tane mooringExtras adlı bir özellikte tanımlanan dizideki nesne), ng-change çağrıldığında (bkz. kod) bir http isteği ile güncellenen bir bookingPrice nesnesinin bir özelliğidir. Karmaşık olduğunu biliyorum, daha iyi nasıl basitleştireceğimi bilmediğim için özür dilerim.

Ekstra nesne, girdi için model olan "nicelik" ile bir dizi özellik içerir. İşte

ekstra nesnenin JSON geçerli: Her zaman ng değiştirme bookingPrice nesne değiştirilir denir

{"id":401,"bookableFeatureId":13,"mooringFeatureId":4,"featureName":"Wi-fi","bookingId":1104,"booked":true,"price":100.00,"totalAmount":300.00,"days":8,"quantity":3,"currencyUnit":"SEK","created":1460542055177} 

Ancak extra.quantity değeri aynı kalır.

+1

çalışacak bir sahip onun döngüsü yapıyor min 'özniteliği. Bir döngü genellikle Açısal'nın bir değişikliği algıladığı ve daha sonra 'change' işlevini başlattığı anlamına gelir. Belki bir kemanda çoğaltabilir misin? – Michelangelo

+1

senin min bir direktif mi? – Lulylulu

+1

Ben sizin durumunuzu taklit edecek bir plunkr yaptım ama bana (Firefox üzerinde) iyi çalışıyor http://plnkr.co/edit/XyEyGTvuYKyz1GGmWjuP?p=preview (ayrıca min, standart HTML değil, bir açısal direktif değil, sürece Böyle bir isimle bir direktifiniz var) – valepu

cevap

1

sizin onChange işlevinde yaptığın bu:

_this.bookingPrice = response.data;

Hangi, sorunuzun içinde yazdıklarını göre, kendi girdileri oluşturmak için yineleme dizi içeren nesnedir .

Nesneyi tamamen değiştirdiğinizde, ng-repeat girişleri sıfırdan oluşturur.Girişinizde min ayarlandığında, giriş girişi geçerli değilse ng-change'u tetikleyecektir (bu durumda ng-model undefined değerini ayarlamak için açısal ayar açılacaktır), bu da ng-repeat'u yeniden tetikleyecek olan tüm diziyi değiştirecek, girişleri yeniden oluşturacaktır ng-change'u tekrar tetikleyecek bir min özniteliği ile ...

Normalde ng-yineleme, yineleyen verilerdeki değişiklikleri izlemek için nesnenin bir karmasını oluşturur, eğer tamamen değiştirirseniz, o zaman eski nesneyi silip (aynı verilere sahip olsa bile) yeni bir tane koyduysanız, track by extra.id'u kullanarak, nesneyi değiştirmiş olsanız bile aslında değişmediklerini söyleyeceksiniz (hala aynı .id) ve nesneleri scr'den yeniden oluşturmaz atch, ancak bu bir çözümdür ancak muhtemelen geçerli dizinin değerlerini değiştirmek için iyi bir uygulamadır.

Bu plunkr içinde sorunu tekrar başarmış

: Eğer çizgiyi kaldırırsanız http://plnkr.co/edit/XyEyGTvuYKyz1GGmWjuP?p=preview

:

ctrl.objects = [{quantity: 0, price: 0, booked: true}, {quantity: 0, price: 0, booked: true}]; 

ben Açısal tahmin tekrar

+0

Benim gibi aynı sonucu, ancak daha iyi ifade ve neden min neden sorun açıkladı. Teşekkür ederim ve kabul etti. Min, yaratılışta çağrılacak ng değişime neden oluyor? –

+1

min, sahada HTML5 doğrulamasını tetikler ve açısal değerler, tanımlanmamış değerlere ayarlanır, eğer başlangıç ​​değerleri doğruysa, ng değişimini tetiklemez – valepu

1

Sorunun neden yalnızca alandaki min özniteliğinde gerçekleştiğinden hala emin değilim, ancak giriş alanını sardım ng-yinesine "track by extra.id" ekleyerek sorunu çözdüm. Modelin bir özellik olduğu "ekstra" nesne değiştiğinde sanırım, ng değişimini tetikleyen giriş alanını açısal olarak yeniden oluşturdu. Değişmeyen bir id tarafından izlenmesiyle, açısal, kimlik aynı kaldığından, böylece ng değişimini tetiklemediğinden giriş alanını yeniden oluşturmak zorunda değildir.

Bunu cevabım olarak kabul edeceğim, ancak neden en az neden çalıştığını açıklayabilirse, bunun yerine cevabını memnuniyetle kabul edeceğim.

Sadece anlamışlardır
+0

Bekle, sadece bir şey fark ettim. _this.bookingPrice = response.data; _this.bookingPrice, girişlerin bulunduğu diziyi içeren aynı nesnedir? – valepu

+0

@valepu Evet, bu –

İlgili konular