2012-10-02 44 views
43

Tôi đang cố gắng xây dựng một máy tính đơn giản trong Góc mà tôi có thể ghi đè tổng số nếu muốn. Tôi có phần này làm việc nhưng khi tôi quay trở lại để nhập vào một số trong các lĩnh vực một hoặc hai tổng số không được cập nhật trong lĩnh vực này.Trường nhập JS cập nhật góc sau khi thay đổi

Đây là jsfiddle tôi http://jsfiddle.net/YUza7/2/

Dạng

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

Các javascript

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

Như @ Martin nói, bạn cần phải ràng buộc vào một giá trị ghi (vì vậy không phải là một chức năng) để có thể nhận được nó trở lại từ phạm vi $ trong bộ điều khiển. – Guillaume86

Trả lời

39

Bạn có thể thêm ng-change chỉ thị vào các trường nhập. Hãy xem tài liệu example.

+0

Tìm thấy ng-thay đổi để phù hợp hơn vì nó không can thiệp vào các thành phần nạp ban đầu – map7

+11

Trong khi câu trả lời hữu ích, nó đủ điều kiện làm câu trả lời chỉ liên kết. Sẽ là tuyệt vời để có một ví dụ ở đây trên trang web, đề cập đến các câu hỏi cụ thể từ OP ... –

+0

Bạn nên sử dụng $ watcher trong chỉ thị thay vì ng-thay đổi với một "gọi lại" trong xem. Xem dữ liệu của bạn trong mã chỉ thị của bạn và lưu hàm de-register trong một var để gọi nó khi scope event $ destroy fire. – Disfigure

28

Tôi đoán rằng khi bạn nhập một giá trị vào trường tổng số mà biểu hiện giá trị bằng cách nào đó được ghi đè.

Tuy nhiên, bạn có thể thực hiện một cách tiếp cận thay thế: Tạo trường cho tổng giá trị và khi các thay đổi one hoặc two cập nhật trường đó.

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

Và thay đổi javascript:

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

Ví dụ fiddle here.

+3

Trường nhập +1 phải luôn có thuộc tính ng-model/$ scope được liên kết. Thông số "giá trị" không được sử dụng trong ứng dụng Góc. Xem thêm http://stackoverflow.com/questions/10610282/angularjs-value-attribute-on-an-input-text-box-is-ignored-when-there-is-a-ng-m –

-4

Tạo chỉ thị và đặt đồng hồ trên đó.

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

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

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

})

+0

Vui lòng sửa ví dụ mã của bạn. –

3

Bạn chỉ cần sửa định dạng của html của bạn

<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

Vấn đề với điều này là nếu tôi thay đổi tổng số, sau đó đi và thay đổi số 1 hoặc số 2 tổng số không còn hoạt động như tôi đã ghi đè 'giá trị'.Sử dụng ng-thay đổi không có vấn đề này – map7

5

tôi đã viết một chỉ thị, bạn có thể sử dụng để ràng buộc một ng-mô hình cho bất kỳ biểu thức bạn muốn. Bất cứ khi nào biểu thức thay đổi, mô hình được đặt thành giá trị mới.

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

Bạn có thể sử dụng nó trong các mẫu của bạn như thế này:

<li>Total<input type="text" ng-model="total" bound-model="one * two"></li>  
Các vấn đề liên quan