91

フォームにいくつかの動的な質問を入力したい(ここでフィドル):

<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["GenderQuestion"]ではなく、文字通りAnswers ["{{question.Name}}"]であることを除いて、すべてが機能します。そのモデル名を動的に設定するにはどうすればよいですか?

4

5 に答える 5

122

http://jsfiddle.net/DrQ77/

にjavascript式を入れるだけですng-model

于 2012-09-23T21:55:17.787 に答える
32

このようなものを使用できます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">
于 2015-08-19T13:03:51.253 に答える
13

私がやったことは次のようなものです:

コントローラ内:

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

したがって、テンプレートでは、(「回答」の場合のように)特定のハードコードされた要素の下だけでなく、完全に動的な名前を使用できます。

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

お役に立てれば。

于 2013-04-12T18:43:22.083 に答える
3

@abourgetによって提供される回答をより完全にするために、次のコード行のscopeValue[field]の値を未定義にすることができます。これにより、サブフィールドの設定時にエラーが発生します。

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

この問題を解決する1つの方法は、属性ng-focus = "nullSafe(field)"を追加することです。したがって、コードは次のようになります。

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

次に、次のようなコントローラーでnullSafe(フィールド)を定義します。

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

これにより、scopeValue [field] [subfield]に値を設定する前に、scopeValue[field]が未定義にならないことが保証されます。

注:ng-modelが変更された後にng-changeが発生し、scopeValue [field]が未定義の場合にエラーがスローされるため、ng-change = "nullSafe(field)"を使用して同じ結果を得ることができません。

于 2014-06-28T23:40:19.703 に答える
1

またはあなたは使用することができます

<select [(ngModel)]="Answers[''+question.Name+'']" ng-options="option for option in question.Options">
        </select>
于 2019-10-13T00:00:11.827 に答える