2013-02-27 33 views
11

Sử dụng angular.js, tôi có một danh sách động các trường biểu mẫu tôi muốn hiển thị cho người dùng để chỉnh sửa (và nộp sau):angular.js, không thể chỉnh sửa tự động tạo ra các lĩnh vực

var app = angular.module('app', []); 
app.controller('Ctrl', function($scope) { 
    $scope.fields = { 
     foo: "foo", 
     bar: "bar", 
     baz: "baz" 
    }; 
}); 

Và HTML:

<div ng-app="app" ng-controller="Ctrl"> 
    <table> 
     <th>key</th> 
     <th>value</th> 
     <th>fields[key]</th> 
     <tr ng-repeat="(key,value) in fields"> 
      <td>{{key}}:</td> 
      <td><input type="text" ng-model="value"/></td> 
      <td><input type="text" ng-model="fields[key]"/></td> 
     </tr> 
    </table> 
</div> 

Xem this fiddle. Vì lý do tôi không hiểu, các hộp nhập văn bản không thể chỉnh sửa được. Tôi đã thử hai cách khác nhau như được thấy ở trên: valuefields[key]. value hoàn toàn không thể chỉnh sửa được và fields[key] sẽ cho phép một phím tắt và sau đó nó sẽ làm mờ. Tôi đang làm gì sai? Cảm ơn bạn.

+0

nó có thể chỉnh sửa nhưng sau mỗi lần nhấn phím lĩnh vực văn bản của bạn mất tập trung do đó bạn phải click vào nó một lần nữa để đưa char khác – SET

+2

Và điều đó xảy ra cuz toàn bộ bạn mẫu được tái rendered sau mỗi thay đổi trong bất kỳ mô hình. Và sau khi mẫu được hiển thị lại, hiện tại không có cách nào để biết đầu vào nào cần được tập trung. Vì vậy, bạn nên tạo theo cách đó và bạn có thể muốn viết chỉ thị để giữ tiêu điểm trên đầu vào được chọn. – SET

+0

Cảm ơn @SET, điều đó hoàn toàn có ý nghĩa, bạn nên làm cho câu trả lời đó! –

Trả lời

3

Có thể chỉnh sửa nhưng sau mỗi lần nhấn, trường văn bản của bạn sẽ mất tiêu điểm để bạn phải nhấp lại vào đó để đặt một char khác.

Và điều đó xảy ra vì toàn bộ mẫu của bạn được hiển thị lại sau mỗi thay đổi trong bất kỳ mô hình nào. Và sau khi mẫu được hiển thị lại, hiện tại không có cách nào để biết đầu vào nào cần được tập trung. Vì vậy, bạn nên tạo theo cách đó và bạn có thể muốn viết chỉ thị để giữ tiêu điểm trên đầu vào được chọn.

+1

Trong câu trả lời tôi đã cung cấp (nó sử dụng một mảng các đối tượng), trường nhập không mất tiêu điểm khi bạn nhập vào nó, nhưng mô hình đang thay đổi. Bạn có biết tại sao 'trường [key]' gây ra tái render, nhưng không phải 'field.value'? –

+0

@MarkRajcok, đây thực sự là những gì tôi định hỏi bạn. Không, tôi không muốn nhưng không biết. Ngoài ra, sau khi tôi tìm thấy giải pháp với mảng mà thực sự làm việc, tôi đoán bài viết của tôi không nên được chọn là câu trả lời. – SET

+0

@SET câu trả lời của bạn ngay lập tức giải thích vấn đề là gì và trả lời câu hỏi của tôi "tôi đang làm gì sai?" vì vậy tôi sẽ để lại câu trả lời cho bạn. Cảm ơn một lần nữa! –

3

Bạn cần sử dụng một mảng đối tượng. Hy vọng rằng bạn có thể làm lại mô hình của mình:

$scope.fields = [ 
    {label: "foo", value: "foov"}, 
    {label: "bar", value: "barv"}, 
    {label: "baz", value: "bazv"} 
]; 

<tr ng-repeat="field in fields"> 
    <td>{{field.label}}:</td> 
    <td><input type="text" ng-model="field.value"> 

Fiddle.

+0

Cảm ơn bạn! Tôi cũng thích cách này, như một giải pháp thay thế được đóng gói thêm cho câu trả lời được đưa ra bởi @ Coder1. Không có vấn đề gì tôi thấy bây giờ tôi sẽ phải chuyển đổi dữ liệu từ máy chủ bằng cách nào đó. Tôi lo lắng rằng cách tiếp cận này đang tận dụng một cái gì đó có chủ ý hay không về Angular mà nó không kiểm tra sâu trên mảng 'fields' đã xem (kết luận có thể không chính xác của tôi về cách thức hoạt động), và điều này có thể thay đổi trong tương lai. –

5

SET đã trả lời lý do tại sao nó xảy ra, nhưng một công việc xung quanh để đạt được hành vi mong muốn sẽ là duy trì một mảng riêng biệt của các phím của bạn, và chạy ng-lặp lại các phím đó. Tôi đã thêm một số trường văn bản để thử nghiệm để thêm các thuộc tính khác vào $scope.fields

Bạn có thể sử dụng $ watch để tự động đặt khóa khi thuộc tính thay đổi, nếu yêu cầu của bạn là số lượng trường có thể thay đổi.

http://jsfiddle.net/aERwc/10/

đánh dấu

<div ng-app="app" ng-controller="Ctrl"> 
    <table> 
     <th>key</th> 
     <th>value</th> 
     <tr ng-repeat="key in fieldKeys"> 
      <td>{{key}}:</td> 
      <td><input type="text" ng-model="fields[key]"/></td> 
     </tr> 
    </table> 
    <div><h6>Add a field</h6> 
     key: <input type="text" ng-model="keyToAdd" /><br /> 
     value: <input type="text" ng-model="valueToAdd" /> 
     <button ng-click="addField()">Add Field</button> 
    </div> 
</div> 

khiển

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

app.controller('Ctrl', function($scope) { 
    $scope.fields = { 
     foo: "foo", 
     bar: "bar", 
     baz: "baz" 
    }; 
    $scope.fieldKeys = []; 

    $scope.setFieldKeys = function() { 
     var keys = []; 
     for (key in $scope.fields) { 
      keys.push(key); 
     } 
     $scope.fieldKeys = keys; 
    } 

    $scope.addField = function() { 
     $scope.fields[$scope.keyToAdd] = $scope.valueToAdd; 
     $scope.setFieldKeys(); 
     $scope.keyToAdd = ''; 
     $scope.valueToAdd = ''; 
    } 

    $scope.setFieldKeys(); 
}); 
+0

Đây chính xác là những gì tôi sẽ làm như một giải pháp thay thế. Công cụ tuyệt vời cảm ơn! –

+0

+1: cách này giải quyết được sự cố mà không phải thay đổi mô hình dữ liệu. Phương thức 'setFieldKeys' có thể được thay thế bằng' $ scope.fieldKeys = Object.keys (data); 'Tôi tin. – mnemosyn

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