Đang khởi tạo chọn với AngularJS và ng-repeat


133

Tôi đang cố gắng chọn hộp chọn để bắt đầu với tùy chọn điền sẵn bằng cách sử dụng ng-repeat với AngularJS 1.1.5. Thay vào đó, lựa chọn luôn bắt đầu với không có gì được chọn. Nó cũng có một tùy chọn trống mà tôi không muốn. Tôi nghĩ rằng có một tác dụng phụ của không có gì được lựa chọn.

Tôi có thể làm việc này bằng cách sử dụng ng-Tùy chọn thay vì ng-repeat, nhưng tôi muốn sử dụng ng-repeat cho trường hợp này. Mặc dù ví dụ thu hẹp của tôi không hiển thị nó, tôi cũng muốn đặt thuộc tính tiêu đề của từng tùy chọn và không có cách nào để làm điều đó bằng cách sử dụng tùy chọn ng, theo như tôi biết.

Tôi không nghĩ rằng điều này có liên quan đến vấn đề thừa kế phạm vi / nguyên mẫu chung của AngularJs. Ít nhất tôi không thấy bất cứ điều gì rõ ràng khi kiểm tra ở Batarang. Ngoài ra, khi bạn chọn một tùy chọn trong phần chọn với UI, mô hình sẽ cập nhật chính xác.

Đây là HTML:

<body ng-app ng-controller="AppCtrl">
    <div>
        Operator is: {{filterCondition.operator}}
    </div>
    <select ng-model="filterCondition.operator">
       <option 
           ng-repeat="operator in operators" 
           value="{{operator.value}}"
       >
           {{operator.displayName}}
       </option>
    </select>
</body>

Và JavaScript:

function AppCtrl($scope) {

    $scope.filterCondition={
        operator: 'eq'
    }

    $scope.operators = [
        {value: 'eq', displayName: 'equals'},
        {value: 'neq', displayName: 'not equal'}
     ]
}

Fiddle JS cho điều này: http://jsfiddle.net/coverbeck/FxM3B/2/


1
ngOption đã được tạo vì không có cách nào rõ ràng để làm điều này với ngRepeat. ngRepeat hủy đăng ký sau khi tùy chọn đã được chọn. Bạn đã thử cài đặt ngSelect trên các tùy chọn của mình chưa
TheSharpieOne

Đúng! Các ngSelected đã làm việc! Tôi sẽ đăng một JsFiddle làm việc cập nhật.
Charles O.

Cần lưu ý rằng trong AngualrJS 1.2, mã này hoạt động khác - Nó không tạo ra phần tử <OPTION> trống mới, tuy nhiên, nó chỉ có thể chọn tùy chọn đầu tiên trong hộp danh sách. Bạn có thể thấy nó ở đây
VitalyB

Câu trả lời:


226

ĐỒNG Ý. Nếu bạn không muốn sử dụng đúng cách ng-options, bạn có thể thêm ng-selectedthuộc tính với logic kiểm tra điều kiện cho lệnh optionđể làm cho lựa chọn trước hoạt động.

<select ng-model="filterCondition.operator">
    <option ng-selected="{{operator.value == filterCondition.operator}}"
            ng-repeat="operator in operators"
            value="{{operator.value}}">
      {{operator.displayName}}
    </option>
</select>

Working Demo


37
Tôi sẽ cung cấp cho bạn khoản tín dụng kể từ khi bạn tự mình tìm ra và làm ví dụ đầy đủ. Mặc dù tôi không đồng ý với nhận xét của bạn về các tùy chọn ng là "cách chính xác". :) Tôi đã luôn sử dụng các tùy chọn ng, nhưng điều này bắt buộc phải làm một cái gì đó mà các tùy chọn ng không hỗ trợ, nhỏ như vậy. Và tài liệu Angular nói rằng bạn cũng có thể sử dụng ng-repeat. Cảm ơn, Charles
Charles O.

Cảm ơn, đó là một cách dễ dàng để vô hiệu hóa một số tùy chọn.
Dorian

11
ng-Tùy chọn chỉ đúng miễn là các usecase của nó phù hợp với bạn. Bạn có thể cần các thuộc tính / lớp bổ sung trong các trường tùy chọn / optgroup, v.v.
mystrdat

6
"đúng cách" không làm việc đôi khi (ví dụ nếu bạn muốn dịch các chuỗi cư tên tùy chọn.)
BTK

11
Tôi nghĩ rằng biểu thức ng được chọn phải không có {{}}: ng-chọn = "toán tử.value == filterCondition.operator"
mvermand

35

Đối với thẻ chọn, angular cung cấp chỉ thị ng-tùy chọn. Nó cung cấp cho bạn khung cụ thể để thiết lập các tùy chọn và đặt mặc định. Dưới đây là fiddle được cập nhật bằng cách sử dụng ng-tùy chọn hoạt động như mong đợi: http://jsfiddle.net/FxM3B/4/

HTML cập nhật (mã giữ nguyên)

<body ng-app ng-controller="AppCtrl">
<div>Operator is: {{filterCondition.operator}}</div>
<select ng-model="filterCondition.operator" ng-options="operator.value as operator.displayName for operator in operators">
</select>
</body>

3
Xin chào Jeremy - Tôi đang cố gắng làm điều này mà không có tùy chọn ng. Giống như tôi đã nói trong câu hỏi của mình và trả lời Shaun, tôi muốn đặt thuộc tính tiêu đề cho mỗi tùy chọn và tôi không thể làm điều đó với các tùy chọn ng, theo như tôi biết. Cảm ơn, Charles
Charles O.

9

Cảm ơn TheSharpieOne đã chỉ ra tùy chọn ng- select . Nếu điều đó đã được đăng dưới dạng câu trả lời thay vì bình luận, tôi sẽ đưa ra câu trả lời đúng.

Đây là một JSFiddle đang hoạt động: http://jsfiddle.net/coverbeck/FxM3B/5/ .

Tôi cũng đã cập nhật fiddle để sử dụng thuộc tính title mà tôi đã bỏ qua trong bài viết gốc của mình, vì đó không phải là nguyên nhân của vấn đề (nhưng đó là lý do tôi muốn sử dụng ng-repeat thay vì ng-tùy chọn) .

HTML:

<body ng-app ng-controller="AppCtrl">
<div>Operator is: {{filterCondition.operator}}</div>
<select ng-model="filterCondition.operator">
   <option ng-repeat="operator in operators" title="{{operator.title}}" ng-selected="{{operator.value == filterCondition.operator}}" value="{{operator.value}}">{{operator.displayName}}</option>
</select>
</body>

JS:

function AppCtrl($scope) {

    $scope.filterCondition={
        operator: 'eq'
    }

    $scope.operators = [
        {value: 'eq', displayName: 'equals', title: 'The equals operator does blah, blah'},
        {value: 'neq', displayName: 'not equal', title: 'The not equals operator does yada yada'}
     ]
}

Xin lỗi về việc đăng bài như một bình luận. Tôi không cảm thấy muốn làm một ví dụ và tôi không chắc chắn 100% nó sẽ hoạt động. Đó chỉ là một linh cảm.
TheSharpieOne

9

Thực tế là góc đang tiêm một phần tử tùy chọn trống vào phần chọn là đối tượng mô hình được liên kết với nó theo mặc định đi kèm với một giá trị trống khi được khởi tạo.

Nếu bạn muốn chọn một tùy chọn mặc định thì có lẽ bạn có thể đặt nó trên phạm vi trong bộ điều khiển

$scope.filterCondition.operator = "your value here";

Nếu bạn muốn giữ chỗ tùy chọn trống, điều này hiệu quả với tôi

<select ng-model="filterCondition.operator" ng-options="operator.id as operator.name for operator in operators">
  <option value="">Choose Operator</option>
</select>

2
Điều này là tốt, nhưng Angular tạo ra một tùy chọn trống. Làm thế nào để tránh điều này?
MarceloBarbosa

1

Như đã đề xuất, bạn cần sử dụng tùy chọn ng và thật không may, tôi tin rằng bạn cần tham chiếu phần tử mảng cho mặc định (trừ khi mảng là một chuỗi các chuỗi).

http://jsfiddle.net/FxM3B/3/

JavaScript:

function AppCtrl($scope) {


    $scope.operators = [
        {value: 'eq', displayName: 'equals'},
        {value: 'neq', displayName: 'not equal'}
     ]

    $scope.filterCondition={
        operator: $scope.operators[0]
    }
}

HTML:

<body ng-app ng-controller="AppCtrl">
<div>Operator is: {{filterCondition.operator.value}}</div>
<select ng-model="filterCondition.operator" ng-options="operator.displayName for operator in operators">
</select>
</body>

Bạn có biết tại sao và bạn có chắc chắn? Tài liệu ( docs.angularjs.org/api/ng.directive:select ) cho biết bạn chỉ cần sử dụng tùy chọn ng khi liên kết với giá trị không phải là chuỗi. Giống như tôi đã nói tôi muốn sử dụng thuộc tính title, và không có cách nào để làm điều đó với các tùy chọn ng. Một cái gì đó như <tùy chọn title = "Mô tả rất dài về lựa chọn này" ...> Cảm ơn.
Charles O.

Tôi tin rằng ghi chú trong tài liệu là một chút không rõ ràng và thực sự có nghĩa là bạn sẽ phải sử dụng một chuỗi cho mô hình và có một chuỗi các chuỗi cho các tùy chọn. Nếu bạn không quan tâm lý do sử dụng thuộc tính "title" thì tôi không thấy nó trên W3C w3schools.com/tags/tag_option.asp và không thể nhớ lại bằng cách sử dụng nó thực sự. Bạn không thể lưu trữ mô tả trong các đối tượng sau đó vẫn truy xuất dữ liệu đó vì đó là những gì mô hình hiện đang bị ràng buộc?
shaunhusain

Trên trang W3C mà bạn đã liên kết đến, nếu bạn nhấp vào liên kết Thuộc tính toàn cầu, bạn sẽ thấy thuộc tính tiêu đề được hỗ trợ bởi thành phần tùy chọn. Tôi đang sử dụng thuộc tính tiêu đề chỉ để hiển thị văn bản "tooltip", do đó, nếu bạn di chuột qua một tùy chọn, bạn có thể nhận được một mô tả lớn hơn về ý nghĩa của tùy chọn đó. Đó là một điều nhỏ, nhưng sẽ rất tốt nếu có.
Charles O.

@CharlesO. Tôi muốn làm chính xác như bạn. Đặt một đối tượng (giá trị không phải chuỗi) nhưng tôi cũng muốn sử dụng một tiêu đề trong danh sách tùy chọn. Đó có phải là cách giải quyết. Tôi dường như không thể tìm thấy nó ...
Héo

1

Nếu bạn đang sử dụng md-select và ng-repeat ing md-tùy chọn từ vật liệu góc thì bạn có thể thêm ng-model-options="{trackBy: '$value.id'}"vào tro thẻ md-select được hiển thị trong bút này

Mã số:

<md-select ng-model="user" style="min-width: 200px;" ng-model-options="{trackBy: '$value.id'}">
  <md-select-label>{{ user ? user.name : 'Assign to user' }}</md-select-label>
  <md-option ng-value="user" ng-repeat="user in users">{{user.name}}</md-option>
</md-select>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.