2016-04-14 12 views
1

私は、次の入力フィールドがあります。なぜmin属性がngChangeを呼び出すのですか?

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

私の問題は分ディレクティブです。それがある間、入力は何も変更されていない状態でng-changeを繰り返し呼び出すようになりました(私は変更時にajax呼び出しを実行していたためにうまくいかなかった)。私が分を取り除くとうまくいきますし、最大で同じ問題はありません。 モデルが最初にminより上か下かどうかは問題ではないようです。

私はできない何かを誰かが見ることができますか?

編集:私は私の変更機能は何もしない作ってみました、それがなければなりませんので、それが原因私のコードに、問題を停止し

。しかし、私が理解していないのは、それが分なしでうまくいく理由です!

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); 
      }); 
     }; 

モデルがプロパティである "余分な"オブジェクトは関数内で変更されますが、 "量"プロパティは変わりません。これにより、変更が引き起こされる可能性がありますか?

オブジェクトが定義されている方法を示すために編集(valepuによってコメントを参照してください):

余分なオブジェクト(複数可)の配列に(私の入力フィールドがリピータ内でされているが、私の現在のテストに一つだけがあります配列内のオブジェクト)。これはmooringExtrasというプロパティで定義されています。これは、ng-changeが呼び出されたときにhttp要求によって更新される、bookingPriceオブジェクトのプロパティです(コード参照)。私はそれが複雑になることを知って、それをより簡単にする方法を知らないために私の謝罪。

余分なオブジェクトには、入力のモデルである数量である数量のプロパティが含まれています。ここで

は、余分なオブジェクトのJSONです:

{"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} 

NG-変更がbookingPriceオブジェクトが変更されると呼ばれるたびに、しかし、extra.quantityの値は同じまま。

+1

に動作します私が持ったときに角度が彼のサイクルをやっていると思います'min'属性です。サイクルは、通常、Angularが変更を検出した後、それが 'change'関数を起動することを意味します。多分フィドルで再現できますか? – Michelangelo

+1

あなたの分は指令ですか? – Lulylulu

+1

あなたの状況をエミュレートするはずのplunkrを作成しましたが、それはFirefox上でうまく動作しますhttp://plnkr.co/edit/XyEyGTvuYKyz1GGmWjuP?p=preview(またminは標準のHTMLであり、そのような名前のディレクティブを持っています) – valepu

答えて

1

は、私はちょうどあなたのonChange機能で、あなたがこれを行うことを実現しています。

オブジェクトを完全に置き換えると、ng-repeatはゼロから入力を作成します。入力にminが設定されている場合、開始入力が有効でない場合(角度はng-modelをこの場合は未定義に設定します)、入力の作成時にng-changeがトリガーされ、配列全体が変更され、ng-repeatが再度トリガーされ、 ng-changeを再度トリガーする...

通常、ng-repeatは、反復処理中のデータの変更を追跡するためにオブジェクトのハッシュを生成します。完全に置き換えると、 track by extra.idを使って、古いオブジェクトを削除して新しいデータを入れた場合(つまり同じデータを持っていても)、オブジェクトを置き換えても実際には変更されていません。 )、scrからオブジェクトを再作成しませんatchしかし、これは修正ですが、現在の配列の値を置き換えることはおそらく良い習慣です。

私はこのplunkrであなたの問題を再作成するために管理している:http://plnkr.co/edit/XyEyGTvuYKyz1GGmWjuP?p=preview

あなたが行削除する場合:

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

を、それが再び

+0

です。私と同じ結論ですが、より良く言い、あなたがminが問題を引き起こす理由を説明しました。ありがとうございました。そして、受け入れられました。なぜ、minは創造の時に呼び出されるのですか? –

+1

分がフィールドでHTML5の検証をトリガし、角度が無効なフィールドを未定義に設定します。開始値が正しい場合は、変更をトリガしません – valepu

1

私はまだ問題がフィールドのmin属性でのみ発生したが、入力フィールドをラップしたng-repeatに "track by extra.id"を追加すると、私はこの問題を解決しました。私は、モデルがプロパティであった "余分な"オブジェクトが変更され、角度が変更されて入力フィールドが再生成され、その変更がトリガされたと思います。変更されていないidで追跡することで、idは同じままなので、入力フィールドを再生成する必要はありません。したがって、変更をトリガーしません。

私はこれを私の答えとして受け入れますが、なぜ誰もが分なしで働く理由を説明できれば、私は喜んで答えを受け入れます。あなたは、あなたの質問に書いた内容に応じて、あなたの入力を作成するために、上の反復配列を含むオブジェクトである、

_this.bookingPrice = response.data;

+0

待って、私はちょうど1つの事に気づいた。 _this.bookingPrice = response.data; _this.bookingPriceは、入力がある配列を含む同じオブジェクトですか? – valepu

+0

@valepuはい、それは –

関連する問題