Tự động gán ng-model


82

Tôi đang cố tạo một tập hợp các hộp kiểm từ một mảng đối tượng. Tôi đang hướng tới việc các hộp kiểm tự động ánh xạ ng-model của chúng tới một thuộc tính của đối tượng mới sẽ được gửi vào mảng.

Những gì tôi đã nghĩ đến là một cái gì đó như

<li ng-repeat="item in items">
    <label>{{item.name}}</label>
    <input type="checkbox" ng-model="newObject.{{item.name}}">
</li>

Điều này không hoạt động như có thể thấy trên JSFiddle này:

http://jsfiddle.net/GreenGeorge/NKjXB/2/

Ai có thể giúp đỡ?

Câu trả lời:


146

Điều này sẽ cung cấp cho bạn kết quả mong muốn:

<input type="checkbox" ng-model="newObject[item.name]">

Đây là một plunk đang hoạt động: http://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR?p=preview


1
hmm thực sự điều này đã mang lại cho tôi '<input ng-model = "newObject [item.name]">', có phải tôi đang thiếu thứ gì đó không?
George Ananda Eman

Hmm, kỳ lạ, chỉ cần thêm một ví dụ trực tiếp (plunker vì một số lý do jsFiddle không hoạt động bên tôi hôm nay).
pkozlowski.opensource

à vâng, tôi đã quen với việc suy nghĩ trong php và mong đợi đánh dấu thực tế sẽ thay đổi thành tên, nó đã hoạt động. cám ơn!
George Ananda Eman

2
Rực rỡ, chính xác những gì tôi đang tìm kiếm. Tôi yêu Angular!
SharkofMirkwood

1
Nó cũng hoạt động tuyệt vời trong Angular 2. Nhưng cũng có giải pháp cho các đối tượng đa chiều? Trong ví dụ của bạn, if item.nameđôi khi nên trỏ tới newObject['x']và đôi khi tới newObject['x']['y'].
Martin Schneider

23

CHỈNH SỬA Như đã lưu ý chính xác trong các nhận xét sử dụng điều này với ng-change, yêu cầu một ng-model "dummy" phải có trước. Tuy nhiên, cần lưu ý rằng rõ ràng với 1.3, các tùy chọn bắt buộc đã được cung cấp bởi khuôn khổ. Vui lòng kiểm tra https://stackoverflow.com/a/28365515/3497830 bên dưới! /BIÊN TẬP

Đề phòng trường hợp bạn giống như tôi vấp phải một trường hợp đơn giản trong khi có một nhiệm vụ phức tạp hơn, đây là giải pháp mà tôi đưa ra để liên kết động các biểu thức tùy ý với ng-model: http://plnkr.co/edit/ccdJTm0zBnqjntEQfAfx?p = xem trước

Phương pháp: Tôi đã tạo một dynamicModel chỉ thị lấy một biểu thức góc chuẩn, đánh giá nó và liên kết kết quả với phạm vi thông qua ng-model và $ compile.

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

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

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

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

app.directive('dynamicModel', ['$compile', function ($compile) {
    return {
        'link': function(scope, element, attrs) {
            scope.$watch(attrs.dynamicModel, function(dynamicModel) {
                if (attrs.ngModel == dynamicModel || !dynamicModel) return;

                element.attr('ng-model', dynamicModel);
                if (dynamicModel == '') {
                    element.removeAttr('ng-model');
                }

                // Unbind all previous event handlers, this is 
                // necessary to remove previously linked models.
                element.unbind();
                $compile(element)(scope);
            });
        }
    };
}]);

Cách sử dụng đơn giản là dynamic-model = "angleExpression" trong đó angleExpression dẫn đến một chuỗi được sử dụng làm biểu thức cho ng-model.

Tôi hy vọng điều này giúp ai đó đỡ đau đầu khi phải nghĩ ra giải pháp này.

Trân trọng, Justus


3
Bạn là một chiếc phao cứu sinh. Tôi gần như tuyệt vọng trước khi tìm thấy bài viết này.
Nelo Mitranim,

Bạn có thể nói rõ hơn Brian? Bạn đã thử những gì và điều gì đã xảy ra?
Justus Wingert

Đây là một viên ngọc cạnh tranh của một giải pháp. Bạn đã giúp tôi thoát khỏi một vấn đề rất khó khăn - cảm ơn!
Mikebert 4

1
ng-change không hoạt động với điều này. Nếu bạn tìm trong nguồn góc, chỉ thị ngChange có ngModel là chỉ thị bắt buộc. Tìm kiếm nhanh chỉ cho thấy ngChange và ngList có vấn đề này. Tất cả các lệnh khác dường như có ngModel như một bộ điều khiển tùy chọn. Tôi đã giải quyết vấn đề này bằng cách thêm ng-model = "dummyValue" vào bất kỳ phần tử nào bằng cách sử dụng chỉ thị mô hình động. Vì một thay đổi đối với mô hình động gọi $ compile, ngChange và bất kỳ lệnh nào khác sử dụng giá trị ng-model đều được cập nhật chính xác.
EverPresent

1
Đây là một giải pháp mạnh mẽ hơn, khi bạn không cần phải xem giá trị mô hình động thay đổi - stackoverflow.com/a/32096328/887092
Todd

6

Với Angular 1.3, bạn có thể sử dụng ng-model-optionschỉ thị để gán động mô hình hoặc liên kết với một biểu thức.

Đây là một plunkr: http://plnkr.co/edit/65EBiySUc1iWCWG6Ov98?p=preview

<input type="text" ng-model="name"><br>
<input type="text" ng-model="user.name" 
ng-model-options="{ getterSetter: true }">

Thông tin thêm tại ngModelOptionsđây: https://docs.angularjs.org/api/ng/directive/ngModelOptions


Thứ lỗi cho tôi nếu tôi thiếu điều gì đó, nhưng không có gì về plunk của bạn dường như bao gồm việc gán mô hình động. Và không có gì về ngModelOptions rõ ràng sẽ hỗ trợ điều đó. Bạn có thể làm rõ? Bởi vì nó sẽ cực kỳ hữu ích nếu trên thực tế, nó hoạt động theo cách đó ...
XML

@XMLilley "getterSetter: giá trị boolean xác định có hay không xử lý các hàm liên kết với ngModel là getters / setters."
Chris Bolton

Cảm ơn Rob đã khiến tôi chú ý đến vấn đề này, tôi đã cập nhật câu trả lời của mình và liên kết với câu trả lời của bạn.
Justus Wingert

1

Đây là cách tiếp cận của tôi để hỗ trợ biểu thức sâu hơn, ví dụ: 'model.level1.level2.value'

<input class="form-control" ng-model="Utility.safePath(model, item.modelPath).value">

trong đó item.modelPath = 'level1.level2' và Utility (model, 'level1.level2') là hàm tiện ích trả về model.level1.level2


Bạn có thể mở rộng về cách thức hoạt động của nó? Utility.safePath trả về điều gì để bạn có thể sử dụng .value?
Devon Holcombe

Utility.safePath trả về giá trị của biến lồng nhau được chỉ định bởi chuỗi đường dẫn. ví dụ: level1.level2 tham chiếu đến model.level1.level2.
Kanit Mekritthikrai

0

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

    <div ng-app="myApp" ng-controller="myCtrl">
        <form name="priceForm" ng-submit="submitPriceForm()">
            <div ng-repeat="x in [].constructor(9) track by $index">
                <label>
                    Person {{$index+1}} <span class="warning-text">*</span>
                </label>
                <input type="number" class="form-control" name="person{{$index+1}}" ng-model="price['person'+($index+1)]" />

            </div>
            <button>Save</button>
        </form>
    </div>

    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            $scope.price = [];
            $scope.submitPriceForm = function () {
                //objects be like $scope.price=[{person1:value},{person2:value}....]
                console.log($scope.price);
            }
        });
    </script>
</body>
</html>

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.