ng-model 동적 할당


82

개체 배열에서 확인란 집합을 생성하려고합니다. 체크 박스가 ng-model을 배열에 제출 될 새 개체의 속성에 동적으로 매핑하도록하는 것을 목표로하고 있습니다.

내가 염두에 두었던 것은

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

이 JSFiddle에서 볼 수있는 것처럼 작동하지 않습니다.

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

아무도 도울 수 있습니까?

답변:


146

원하는 결과를 얻을 수 있습니다.

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

다음은 작동하는 플렁크입니다. http://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR?p=preview


1
흠 실제로 이것은 문자 그대로 '<input ng-model = "newObject [item.name]">'을주었습니다. 뭔가 빠진 것이 있습니까?
George Ananda Eman 2013 년

흠, 이상하게 방금 라이브 예제를 추가했습니다 (어떤 이유로 jsFiddle이 오늘 내 편에서 작동하지 않기 때문에 플 런커).
pkozlowski.opensource

아 예, 저는 PHP에서 생각하는 데 익숙했고 실제 마크 업이 이름으로 변경 될 것으로 예상했습니다. 고마워!
George Ananda Eman 2013 년

2
훌륭합니다. 정확히 제가 찾던 것입니다. 저는 Angular를 좋아합니다!
SharkofMirkwood

1
Angular 2에서도 잘 작동합니다.하지만 다차원 객체에 대한 솔루션도 있습니까? 귀하의 예에서 if item.name는 때때로을 가리키고 newObject['x']때로는 newObject['x']['y'].
Martin Schneider

23

편집 ng-change와 함께 이것을 사용하는 주석에서 올바르게 언급했듯이 "더미"ng-model이 미리 존재해야합니다. 그러나 1.3에서는 프레임 워크에서 필요한 옵션을 제공 한 것으로 보입니다. 아래 https://stackoverflow.com/a/28365515/3497830을 확인 하세요! /편집하다

좀 더 복잡한 작업을하면서 간단한 경우에 걸림돌이되는 저와 같은 경우를 대비하여 ng-model에 동적으로 임의의 표현식을 바인딩하기 위해 고안 한 솔루션입니다. http://plnkr.co/edit/ccdJTm0zBnqjntEQfAfx?p = 미리보기

방법 : 표준 각도 표현식을 사용하여 평가하고 결과를 ng-model 및 $ compile을 통해 범위에 연결하는 dynamicModel 지시문을 만들었습니다.

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);
            });
        }
    };
}]);

사용법은 단순히 dynamic-model = "angularExpression"입니다. 여기서 angularExpression은 ng-model의 표현식으로 사용되는 문자열을 생성합니다.

나는 이것이 누군가 가이 해결책을 찾아야하는 두통을 덜어주기를 바랍니다.

감사합니다, Justus


3
당신은 생명의 은인입니다. 이 게시물을 찾기 전에 거의 절망했습니다.
Nelo Mitranim

더 구체적으로 브라이언이 될 수 있습니까? 무엇을 시도했고 무슨 일이 있었습니까?
Justus Wingert 2014-07-28

이것은 솔루션의 경쟁 보석입니다. 매우 끈적 거리는 문제를 해결했습니다. 감사합니다!
Mikebert4

1
ng-change는 이것으로 작동하지 않습니다. 각도 소스를 살펴보면 ngChange 지시문에는 필수 지시문으로 ngModel이 있습니다. 빠른 검색은 ngChange 및 ngList에만이 문제가 있음을 보여줍니다. 다른 모든 지시문은 ngModel을 선택적 컨트롤러로 사용하는 것 같습니다. dynamic-model 지시문을 사용하여 모든 요소에 ng-model = "dummyValue"를 추가하여이 문제를 해결했습니다. 동적 모델이 변경되면 $ compile을 호출하므로 ngChange 및 ng-model 값을 사용하는 기타 지시문이 올바르게 업데이트됩니다.
EverPresent

1
동적 모델 값 변경을 볼 필요가 없을 때 더 강력한 솔루션입니다.- stackoverflow.com
Todd

6

Angular 1.3에서는 ng-model-options지시문을 사용 하여 모델을 동적으로 할당하거나 표현식에 바인딩 할 수 있습니다.

다음은 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 }">

ngModelOptions여기에 대한 자세한 정보 : https://docs.angularjs.org/api/ng/directive/ngModelOptions


내가 빠진 것이 있다면 용서해주세요.하지만 당신의 플렁크에 대한 어떤 것도 동적 모델 할당을 포함하지 않는 것 같습니다. 그리고 ngModelOptions에 대한 어떤 것도 분명히 그것을 지원하지 않을 것입니다. 분명히 말씀해 주시겠습니까? 그것은 사실, 일, 한 경우는 슈퍼 유용 할 수 있기 때문에 그런 식으로 ...
XML

@XMLilley "getterSetter : ngModel에 바인딩 된 함수를 getter / setter로 처리할지 여부를 결정하는 부울 값."
Chris Bolton

이 문제를 알려 주셔서 감사합니다. 제 답변을 업데이트하고 귀하의 답변에 연결했습니다.
Justus Wingert 2015 년

1

이것은 'model.level1.level2.value'와 같이 더 깊은 표현을 지원하는 나의 접근 방식입니다.

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

여기서 item.modelPath = 'level1.level2'및 Utility (model, 'level1.level2')는 model.level1.level2를 반환하는 유틸리티 함수입니다.


이것이 어떻게 작동하는지 확장 할 수 있습니까? .value를 사용할 수 있도록 Utility.safePath는 무엇을 반환합니까?
Devon Holcombe

Utility.safePath는 경로 문자열로 지정된 중첩 변수의 값을 반환합니다. 예를 들어 level1.level2는 model.level1.level2를 참조합니다.
Kanit Mekritthikrai 2010 년

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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.