programing

AngularJS에서 동적 모델 이름을 설정하려면 어떻게 해야 합니까?

i4 2023. 3. 7. 21:06
반응형

AngularJS에서 동적 모델 이름을 설정하려면 어떻게 해야 합니까?

폼에 몇 가지 동적인 질문을 입력합니다(여기에 기재).

<div ng-app ng-controller="QuestionController">
    <ul ng-repeat="question in Questions">
        <li>
            <div>{{question.Text}}</div>
            <select ng-model="Answers['{{question.Name}}']" ng-options="option for option in question.Options">
            </select>
        </li>
    </ul>

    <a ng-click="ShowAnswers()">Submit</a>
</div>
​
function QuestionController($scope) {
    $scope.Answers = {};

    $scope.Questions = [
    {
        "Text": "Gender?",
        "Name": "GenderQuestion",
        "Options": ["Male", "Female"]},
    {
        "Text": "Favorite color?",
        "Name": "ColorQuestion",
        "Options": ["Red", "Blue", "Green"]}
    ];

    $scope.ShowAnswers = function()
    {
        alert($scope.Answers["GenderQuestion"]);
        alert($scope.Answers["{{question.Name}}"]);
    };
}​

모델은 말 그대로 Answers('{질문})인 것을 제외하고 모든 것이 작동합니다.평가된 답변["성별 질문"] 대신 "Name}"을 클릭합니다.어떻게 하면 그 모델명을 동적으로 설정할 수 있을까요?

http://jsfiddle.net/DrQ77/

javascript 표현식을 간단하게 넣을 수 있습니다.ng-model.

이런 거 써도 돼scopeValue[field]단, 필드가 다른 오브젝트에 있는 경우에는 다른 솔루션이 필요합니다.

모든 종류의 상황을 해결하려면 다음 명령을 사용할 수 있습니다.

this.app.directive('dynamicModel', ['$compile', '$parse', function ($compile, $parse) {
    return {
        restrict: 'A',
        terminal: true,
        priority: 100000,
        link: function (scope, elem) {
            var name = $parse(elem.attr('dynamic-model'))(scope);
            elem.removeAttr('dynamic-model');
            elem.attr('ng-model', name);
            $compile(elem)(scope);
        }
    };
}]);

Html의 예:

<input dynamic-model="'scopeValue.' + field" type="text">

결국 이렇게 된 거야

컨트롤러 내:

link: function($scope, $element, $attr) {
  $scope.scope = $scope;  // or $scope.$parent, as needed
  $scope.field = $attr.field = '_suffix';
  $scope.subfield = $attr.sub_node;
  ...

따라서 템플릿에서는 하드 코드화된 특정 요소('Answers'의 경우처럼) 아래뿐만 아니라 완전히 동적인 이름을 사용할 수 있습니다.

<textarea ng-model="scope[field][subfield]"></textarea>

이게 도움이 됐으면 좋겠다.

@abourget이 제공하는 답변을 보다 완전하게 하기 위해 다음 코드 행의 scopeValue[field] 값을 정의할 수 없습니다.이로 인해 서브필드를 설정할 때 다음 오류가 발생합니다.

<textarea ng-model="scopeValue[field][subfield]"></textarea>

이 문제를 해결하는 한 가지 방법은 ng-focus="null Safe(필드)" 속성을 추가하는 것입니다. 그러면 코드가 다음과 같습니다.

<textarea ng-focus="nullSafe(field)" ng-model="scopeValue[field][subfield]"></textarea>

다음으로 다음과 같은 컨트롤러에서 null Safe()를 정의합니다.

$scope.nullSafe = function ( field ) {
  if ( !$scope.scopeValue[field] ) {
    $scope.scopeValue[field] = {};
  }
};

그러면 scopeValue[field][subfield]로 값을 설정하기 전에 scopeValue[field]가 정의되지 않습니다.

참고: ng-change="null Safe(field)"를 사용하여 동일한 결과를 얻을 수 없습니다. ng-change는 ng-모델이 변경된 후에 발생하므로 scopeValue[field]가 정의되지 않은 경우 오류가 발생합니다.

또는 를 사용할 수 있습니다.

<select [(ngModel)]="Answers[''+question.Name+'']" ng-options="option for option in question.Options">
        </select>

언급URL : https://stackoverflow.com/questions/12553617/how-can-i-set-a-dynamic-model-name-in-angularjs

반응형