2015-04-17 12 views
7

Tôi mới vào js góc, vì vậy hãy một số một giúp tôi out.I có mẫu tôi ở đây:

<form ng-model="signup" form-valid> 
    <input type="text" name="username" ng-model="signup.username">{{signup}} 
</form> 

Và chỉ thị của tôi là như thế này:

app.directive("formValid",function(){ 

return { 
    restrict:"A", 
    require:"ngModel", 
    link:function(scope,element,attrs){ 
      scope.$watch(attrs.ngModel,function(newValue){ 
       if(newValue){ 
       console.log(newValue); 
       } 
      }); 
     } 
    }}); 

Khi nào tôi nhập một số giá trị vào hộp văn bản, mô hình sẽ thay đổi và "$ watch" phải được kích hoạt. Ở đây "$ watch" chỉ được kích hoạt một lần khi lần đầu tiên tôi nhập bất kỳ giá trị nào vào hộp văn bản .Cảm ơn trước.

+1

Bạn có thể muốn xem các thuộc tính của mô hình, không chỉ đối tượng: 'phạm vi. $ Watch (attrs.ngModel, {…}, true);' – Blackhole

+0

Nó phù hợp với tôi. Đối số thứ ba là gì đúng "đang thực hiện.Previuosly mà không" đúng "nó chỉ được bắn một lần. – Nitya

+0

Đối số thứ ba là để xem "sâu" hay không. ví dụ: kiểm tra đối tượng của nó hoặc kiểm tra đối tượng có tất cả các khóa/giá trị giống nhau – dogmatic69

Trả lời

-1

Một giải pháp sẽ là sử dụng ngModel như trong ví dụ bên dưới.

app.directive("formValid",function(){ 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 
     scope.$watch(function() { 
      return ngModel.$modelValue; 
     }, function(newValue) { 
      console.log(newValue); 
     }); 
     } 
    } 
    }); 

Edit: Các giải pháp nhanh nhất sẽ được làm theo những nhận xét của Blackhole và cập nhật hồ của bạn để một chiếc đồng hồ sâu bằng cách thêm true. Điều này là do bạn đang xem thuộc tính signup nhưng giá trị mô hình username là thuộc tính đăng ký. Đồng hồ sâu sẽ phục vụ để xem các thuộc tính.

Sử dụng ngModel trực tiếp thay vì qua attrs hoặc sử dụng trình định dạng hoặc phân tích cú pháp (như chi tiết trong câu trả lời của Michaels là giải pháp tốt hơn theo quan điểm của tôi).

+1

OP đang xem nội dung 'attrs.ngModel', cụ thể là' signup', là biến phạm vi của kế thừa. – Blackhole

+0

Có đủ công bằng, tôi đã cố gắng để làm cho sự khác biệt của việc sử dụng phạm vi so với attrs trong chức năng liên kết để cố gắng và tránh nhầm lẫn với phạm vi thừa hưởng. Tôi sẽ cập nhật câu trả lời của tôi nhưng Michael đã cung cấp một giải pháp tốt. Cảm ơn. – Asta

+0

Cảm ơn Asta.I đã thêm một "true" vào watcher.It hiện đang hoạt động – Nitya

3

Khi bạn sử dụng ngModelController, cách tiêu chuẩn để xem những thay đổi về mô hình này là bằng cách tạo ra một formatter:

link: function(scope, element, attrs, ngModelCtrl) { 
    ngModelCtrl.$formatters.push(function(value) { 
     // Do something with value 
     return value; 
    }); 
} 

Hãy ghi nhớ rằng trình định dạng chỉ được kích hoạt khi mô hình được thay đổi trực tiếp. Nếu thay đổi đến từ giao diện người dùng (nghĩa là người dùng thay đổi điều gì đó), thì trình phân tích cú pháp được kích hoạt để thay thế. Vì vậy, bạn có thể cần phải làm điều này cũng như:

ngModelCtrl.$parsers.push(function(value) { 
    // Do something with value 
    return value; 
}); 

Working Plunker

tôi đề nghị bạn đọc ngModelController tài liệu để bạn hiểu chính xác cách thức những đường ống làm việc.

Nhưng nếu tất cả các bạn muốn làm là nhận được thông báo khi thay đổi mô hình (bạn không muốn hoặc cần không phải định dạng hay phân tích bất cứ điều gì), sau đó bạn có thể làm một cái gì đó đơn giản hơn:

scope: { model: '=ngModel' }, 
link: function(scope) { 
    scope.$watch('model', function(value) { 
     // Do something with value 
    }); 
} 

Working Plunker

Nhưng với tên chỉ thị của bạn, formValid, tôi nghĩ rằng việc sử dụng ngModelController là cách tiếp cận chính xác.

CẬP NHẬT

Đó là đáng nói đến là ngModelController có cho là một thiếu sót: nó không hoạt động rất tốt với các loại "tham khảo" (ví dụ mảng, đối tượng). Bạn có thể tìm thêm chi tiết về số điện thoại here.

+0

Cảm ơn bạn Michael.Nhưng có một điều tôi muốn biết.Thời điểm tôi đã thêm một tham số thứ ba là "true" cho người quan sát của nó bắt đầu xem mô hình.Nhưng trước đây tại sao nó chỉ được kích hoạt một lần? Mã bên dưới hoạt động cho tôi phạm vi. $ Watch ('model', function (value) { // Làm điều gì đó với giá trị }, true); – Nitya

+0

@Nitya Đối số thứ ba cho Angular sử dụng 'angular.equals' để so sánh các giá trị (nghĩa là nó so sánh sâu). Vì vậy, nếu bạn cần theo dõi một đối tượng và được thông báo khi một trong các thuộc tính của nó thay đổi, bạn cần đặt tham số đó (để đổi lấy một số hiệu suất). Đó là một thiếu sót của 'ngModelController': nó không làm loại so sánh đó và do đó hoạt động tốt hơn với" loại giá trị ". –

+0

@Nitya Giới thiệu về đồng hồ chỉ kích hoạt một lần, điều đó được mong đợi. Mỗi đồng hồ chạy ít nhất một lần (với đối số không xác định, nếu thuộc tính đang được xem không có giá trị), như bạn có thể thấy trong [plunker này] (http://plnkr.co/edit/2qWMhOkTSH403i6k0ti0?p=preview). –

Các vấn đề liên quan