2013-07-23 34 views
8

Tôi đang sử dụng biểu mẫu để thêm các phần tử vào danh sách được hiển thị ở bên cạnh biểu mẫu. Markup là:Hình thức trống AngularJs và loại bỏ trạng thái không hợp lệ khỏi các đầu vào

<form name="thingForm"> 
     <input required type="text" ng-model="thing.name"/> 
     <input required type="text" ng-model="thing.value"/> 
     <input type="submit" ng-click="addThing(thing)"/> 
    </form> 
    <ul> 
     <li ng-repeat="thing in things">{{thing.name}} with value of {{thing.value}}</li> 
    </ul> 

Và trong một bộ điều khiển tôi có:

$scope.things = []; 
$scope.addThing = function(thing) { 
    $scope.things.push(thing); 
    $scope.thing = {}; 
}; 

Làm việc jsfiddle: http://jsfiddle.net/cXU2H/1/

Bây giờ như bạn có thể nhìn thấy, tôi có thể làm rỗng các hình thức bằng cách làm sạch các mô hình, tuy nhiên vì các đầu vào có thẻ bắt buộc nên trình duyệt vẫn hiển thị thông báo lỗi (ít nhất là Chrome).

tôi nhìn vào câu hỏi tương tự và:

  • Tôi cũng đã xem xét câu trả lời này: https://stackoverflow.com/a/16296941/545925 tuy nhiên jsfiddle cư xử giống hệt như trong ví dụ của tôi: sau khi đầu vào là xóa nó vẫn có một ng-invalid-required lớp còn lại (và nó cũng gây ra một thông báo lỗi HTML5)
  • vì tôi không phải trên cành 1.1.x $setPristine() không có sẵn cho tôi$setPristine() cư xử theo cùng một cách

Tôi có thể viết một hàm lặp qua các phần tử của biểu mẫu và loại bỏ mọi lớp ng-invalid-requiredng-invalid, nhưng đó không phải là cách tôi muốn giải quyết vấn đề này. Đó là những gì tôi sẽ làm với jQuery.

+0

'$ setPristine()' là phương pháp đúng ở đây. Nếu bạn không muốn chuyển sang phiên bản 1.1.x, hãy cập nhật phiên bản của bạn bằng cam kết này: https://github.com/angular/angular.js/commit/733a97adf87bf8f7ec6be22b37c4676cf7b5fc2b –

+0

Chi nhánh 1.1.x có phá vỡ bất kỳ thứ gì trong Phiên bản 1.0.x? – adamors

+0

Có một số thay đổi đáng kể trong 1.1.x và có những thay đổi đột phá. Tham khảo các thay đổi: https://github.com/angular/angular.js/blob/master/CHANGELOG.md –

Trả lời

9

Bạn đang sử dụng $ setPristine phải không? Bạn có thể dễ dàng nhìn thấy trong fiddle của bạn rằng nếu bạn thêm nó, nó hoạt động. http://jsfiddle.net/X6brs/

var myApp = angular.module('myApp', []); 

function MyCtrl($scope) { 
    $scope.things = []; 
    $scope.addThing = function(thing) { 
     $scope.things.push(thing); 
     $scope.thing = {}; 
     $scope.thingForm.$setPristine(true); 
    }; 
} 
+0

Nó không. Trong Chrome, tôi gặp phải lỗi HTML5 có nội dung "Vui lòng điền vào trường này" ngay sau khi dữ liệu nhập bị xóa. – adamors

+0

Đó là một vấn đề khác, sau khi gửi nó tập trung vào các trường không hợp lệ đầu tiên; hoặc bạn thay đổi kiểu đầu vào thành nút thay vì gửi hoặc thực hiện event.preventDefault() và xử lý việc gửi theo cách của bạn. –

+0

Bạn nói đúng. Tôi đã thêm một preventDefault vào nút và nó hoạt động. Cảm ơn. – adamors

0
$scope.thingForm.$setPristine(); 
$scope.thingForm.$setUntouched(); 

sẽ làm các trick.

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