2016-09-09 10 views
-1

私はいくつかの複雑な命令を使用していませんが、単純な乗算と角度の2方向の結合は失敗するようです。私が失敗すると言うと、私は乗算するときにビューを更新していません。しかし、いくつかのUI要素をクリックするか、ラジオボタンをクリックするなど、何らかの方法でビューを変更すると、値は魔法のように現れる。何らかの調査の後、私が掛け合ってもその申請は呼ばれていないことが分かった。 $ scopeを追加しました$ apply(function(){})。それはそれを修正するようだ。しかし、私はいくつかのポストで読む。明示的に$ applyを呼び出すことは絶対にしないでください。それは質問をする。何が起こっているの? console.log()は変更された値を表示していますが、値はビューに適用されていません。また、私は直接スコープを操作していません。例えば、角度1.x:なぜ2ウェイ結合が機能しないのですか?

$scope.calculateOutstationCharges = function() { 
     if ($scope.customer.calculatedDistance !== 0) { 
      console.log($scope.customer.kmlimit * $scope.carPricing.perKmCharge * $scope.customer.days); 
      if (($scope.customer.calculatedDistance * 2) < $scope.carPricing.kmlimit * $scope.customer.days) { 
       $scope.customer.totalprice_outstation = $scope.carPricing.kmlimit * $scope.carPricing.perKmCharge * $scope.customer.days + $scope.customer.driverCharge; 
//console.log($scope.customer.totalprice_outstation). This value is not updated in the view 
      } else { 
       $scope.customer.totalprice_outstation = ($scope.customer.calculatedDistance * 2 * $scope.carPricing.perKmCharge)+ $scope.customer.driverCharge; 
       //console.log($scope.customer.totalprice_outstation); nor is this one 
      } 
      $scope.customer.totalprice_outstation += $scope.customer.extra_outstation; 
     } 
     $scope.customer.driverCharge = $scope.carPricing.driverCost; 
$scope.$digest(); //this does it but with $apply in progess error. 
    }; 

値ではない値が作成されたサイクルでは、次のダイジェストサイクルで更新されます。 誰かが似たようなことに遭遇した場合、あなたはそれを解決するために何をしましたか? ありがとう

+0

どのように 'calculateOutstationCharges'を呼び出しますか? –

+0

私はこの関数のように見える関数から呼び出していました。関数calcDistance()この問題についてのことは、角度の外にあるとは、角度の範囲に付けられていない関数と変数を意味します。この場合、呼び出し元の関数は角張っていないため、問題が発生していました。今は動作しているのを修正 –

答えて

1

$ scope.CalculateOutstationChargesは(私は?右この日午前)、角の文脈の外から呼ばれています。

Angularは、$ scope変数が変更されたことを知らない。あなたは明示的に角度を伝える必要があります。これを達成するには、

$timeout(function(){$scope.$apply();}) 

現在のダイジェストサイクルが完了するまで待つ必要があります。次に、DOMに変更された$ scope変数を適用します。

+0

角度の文脈を説明できますか? –

+0

apiを呼び出し、$ scope変数に応答を割り当てる角度アプリケーションでjQuery関数を使用しているとします。今、API呼び出しが行われた後、値も変数に割り当てられます($ scope.outputとしましょう)。 HTMLに{{$ scope.output}}を印刷している場合は、更新された値、つまりレスポンスは表示されません。理由:jQueryは$ scope.outputを変更する責任があります(AngularJSのコンテキストの外にあります)。 AngularJSは変数が変更されたことを知らない。私はこれが何かを説明してくれることを願っています... – Bharat

+0

@Bharat '$ timeout'コールバックの中で' $ apply'を呼び出す必要はありません –

0

角度の範囲外のイベントは、$ applyが推奨されていないと述べたので、変更の角度を知らせるべきです。

Check $applyAsync([exp]);

+0

角度の文脈が意味することを説明できますか?今のところ、角度の範囲に付けられているものはすべて理解しています。私は正しいですか? 'function calcDistance()'のような関数シグネチャからコントローラを呼び出すことは機能していないようだからです。 –

+0

@SarasAryaいいえ。関数が角文脈内で呼び出されるかどうかは、 "who"が関数を呼び出すかどうかに依存します。たとえば、モジュール、コントローラ、ディレクティブ、ファクトリなどに渡す関数、ディレクティブのリンク、コンパイル関数、テンプレートの式(ng-click)、$ timeoutコールバックなどは、すべてアンカーコンテキストと呼ばれます。それ以外のものは、「ネイティブ」イベントリスナー、setTimeoutコールバック、プロミスハンドラのフェッチなどです。詳しくは、https://www.sitepoint.com/understanding-angulars-apply-digest/を参照してください。また、この問題は角度2で 'zone.js'を使って解決されています。 –

関連する問題