2012-10-02 19 views
43

私は必要に応じて合計をオーバーライドすることができる、角度の単純な電卓を作成しようとしています。私はこの部分が働いているが、フィールドに1〜2の数字を入力して戻ると、そのフィールドで合計が更新されない。ここで変更後の角型JS更新入力フィールド

は私jsfiddleはhttp://jsfiddle.net/YUza7/2/

私はあなたが合計フィールドに値を入力するとその値式が何らかの形で取得することを推測しているフォーム

<div ng-app> 
    <h2>Calculate</h2> 

    <div ng-controller="TodoCtrl"> 
    <form> 
     <li>Number 1: <input type="text" ng-model="one"> 
     <li>Number 2: <input type="text" ng-model="two"> 
     <li>Total <input type="text" value="{{total()}}">  
     {{total()}} 
    </form> 
    </div> 
</div> 

javascriptの

function TodoCtrl($scope) { 
    $scope.total = function(){ 
     return $scope.one * $scope.two; 
    }; 
} 
+0

コントローラーの$スコープから戻ってきます。 – Guillaume86

答えて

39

ng-changeディレクティブを入力フィールドに追加できます。ドキュメントexampleをご覧ください。

+0

発見変更最初に読み込まれた要素に干渉しないので、よりフィットします。 – map7

+11

有用な答えですが、リンク専用の回答となります。 OPの具体的な質問を参照して、現場でここに例を載せておいて嬉しいです... –

+0

ビューで "コールバック"を使ってng-changeの代わりに$ watcherを使用してください。ディレクティブコードでデータを監視し、スコープイベント$ destroy fireが発生したときに呼び出すために、登録解除関数をvarに保存します。 – Disfigure

28

です上書きされます。

ただし、別のアプローチをとることもできます。合計値のフィールドを作成し、oneまたはtwoのいずれかのフィールドを更新すると、そのフィールドが更新されます。

<li>Total <input type="text" ng-model="total">{{total}}</li> 

とJavaScript変更:

function TodoCtrl($scope) { 
    $scope.$watch('one * two', function (value) { 
     $scope.total = value; 
    }); 
} 

例フィドルhereを。

+3

+1の入力フィールドには常にng-model/$ scopeプロパティが関連付けられている必要があります。 Angularアプリでは、「値」パラメータを使用しないでください。 http://stackoverflow.com/questions/10610282/angularjs-value-attribute-on-an-input-text-box-is-ignored-when-there-is-a-ng-m –

-4

ディレクティブを作成し、ディレクティブを作成してください。

app.directive("myApp", function(){ 
link:function(scope){ 

    function:getTotal(){ 
    ..do your maths here 

    } 
    scope.$watch('one', getTotals()); 
    scope.$watch('two', getTotals()); 
    } 

})

+0

コード例を修正してください。 –

3

あなたはただ、私はあなたがいずれかにNG-モデルをバインドするために使用することができますディレクティブを書いて、あなたのhtml

<form> 
    <li>Number 1: <input type="text" ng-model="one"/> </li> 
    <li>Number 2: <input type="text" ng-model="two"/> </li> 
     <li>Total <input type="text" value="{{total()}}"/> </li>  
    {{total()}} 

</form> 

http://jsfiddle.net/YUza7/105/

+0

この問題は、私が合計を変更した後、「Number 1」または「Number 2」のいずれかを変更すると、「value」を上書きしたために合計が機能しなくなります。ng-changeを使用してもこの問題はありません – map7

5

のフォーマットを修正する必要がありますあなたが望む表現。式が変わるたびに、モデルは新しい値に設定されます。

module.directive('boundModel', function() { 
     return { 
     require: 'ngModel', 
     link: function(scope, elem, attrs, ngModel) { 
      var boundModel$watcher = scope.$watch(attrs.boundModel, function(newValue, oldValue) { 
      if(newValue != oldValue) { 
       ngModel.$setViewValue(newValue); 
       ngModel.$render(); 
      } 
      }); 

      // When $destroy is fired stop watching the change. 
      // If you don't, and you come back on your state 
      // you'll have two watcher watching the same properties 
      scope.$on('$destroy', function() { 
       boundModel$watcher(); 
      }); 
     } 
    }); 

あなたはこのようなあなたのテンプレートでそれを使用することができます:@Martinは、あなたがそれを得ることができるように書き込み可能な値(そうでない機能)への入力をバインドする必要があり、言ったように

<li>Total<input type="text" ng-model="total" bound-model="one * two"></li>  
関連する問題