【问题标题】:AngularJS: Assign NgModel dynamicallyAngularJS:动态分配 NgModel
【发布时间】:2017-10-02 18:15:42
【问题描述】:

我有一个控制器,其中有一个名为fields 的数组。该数组结构如下(以部分数据为例):

[
    {
        "name": "Demarcación",
        "type": "multiple",
        "scope": "restricted",
        "icon": "location-arrow",
        "order": 1,
        "id": 1,
        "possible_values": [
            {
                "id": 1,
                "field_id": 1,
                "name": "Demarcación 1"
            },
            {
                "id": 2,
                "field_id": 1,
                "name": "Demarcación 2"
            },
            {
                "id": 3,
                "field_id": 1,
                "name": "Demarcación 3"
            }
        ],
        "values": [
            {
                "id": 3,
                "value": "Demarcación 3"
            }
        ]
    },
    ...
]

然后,我想创建一个表单,其中输入是动态构造的,具体取决于字段的typescope。因此,例如,如果scope 等于free,则添加textarea。否则,将添加 input text

我还需要根据字段类型执行一些 Javascript 初始化,因此 - 例如 - 如果 scope 受到限制,我需要在该输入上初始化一个 JQuery 插件。 p>

我尝试设置一个函数,在其中构造 HTML 字符串,然后在 ngRepeat 中打印它,但我得到的文本是纯文本(即使使用 $sce.trustAsHtml()),但没有运气。

问题

有什么方法可以动态编写输入/html 以添加到文档中 - 并处理一些 Javascript 逻辑 - 并且我可以动态附加一些 AngularJS 属性(如 ngModel 所以它的值与数据绑定物体)?

输入将在 ngRepeat 指令中,因此我可以访问迭代的对象,并且可以将它们作为变量传递给函数。

谢谢!

【问题讨论】:

    标签: javascript jquery angularjs dynamic angular-ngmodel


    【解决方案1】:

    这是一个好的开始。寻求指令可能是个好主意。 另外,我认为有很多表单生成器可以处理这类工作:http://schemaform.io/

    var app = angular.module("myApp", []);
    app.controller("myCtrl", function($scope) {
        $scope.fields = window.fields;
        $scope.fieldInit = function(field){
          //console.log('things and stuff: ' + JSON.stringify(field));
         }
    });
    
    window.fields = [
        {
            "name": "field 1",
            "type": "text",
            "scope": "restricted",
            "icon": "location-arrow",
            "order": 1,
            "id": 1,
            "possible_values": [
                {
                    "id": 1,
                    "field_id": 1,
                    "name": "Demarcación 1"
                },
                {
                    "id": 2,
                    "field_id": 1,
                    "name": "Demarcación 2"
                },
                {
                    "id": 3,
                    "field_id": 1,
                    "name": "Demarcación 3"
                }
            ],
            "values": [
                {
                    "id": 3,
                    "value": "Demarcación 3"
                }
            ]
        },
        {
            "name": "field 2",
            "type": "multiple",
            "scope": "restricted",
            "icon": "location-arrow",
            "order": 1,
            "id": 2,
            "possible": [
                {
                    "id": 1,
                    "field_id": 1,
                    "name": "Demarcación 1"
                },
                {
                    "id": 2,
                    "field_id": 1,
                    "name": "Demarcación 2"
                },
                {
                    "id": 3,
                    "field_id": 1,
                    "name": "Demarcación 3"
                }
            ],
            "values": [
                {
                    "id": 3,
                    "value": "Demarcación 3"
                }
            ]
        }
     
    ]
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
     
    
    <div ng-app="myApp" ng-controller="myCtrl">
      <div ng-repeat="field in fields" ng-init="fieldInit(field)">
      {{field.name}}
        <input ng-model="field.model" ng-if="field.type != 'multiple'" type="{{field.type}}"/>
        <select ng-model="field.model" ng-if="field.type == 'multiple'" 
        ng-options="val.name for val in field.possible" />
      <div>
    </div>

    【讨论】:

    • 谢谢!我也曾想过一个指令,但我更愿意以更具可扩展性的方式尝试一下!感谢您的回答和时间!
    • 希望你能像这样处理所有规则。不幸的是,这在某些时候可能看起来很丑陋。 :( 这就是为什么指令会很棒。祝你好运。
    【解决方案2】:

    我认为您正在寻找的是 $compile 服务

    Angular Documentation for $compile

    $compile(element.contents())(scope);
    

    Example in plunkr

    【讨论】:

    • 我认为这是我需要的!我已经对其进行了测试,并且似乎可以正常工作。我唯一担心的是性能。它正在显式观看的事实 - 由我指定 - 这么多属性不会降低性能?感谢您的回答和时间!
    • 事实上,经过一段时间的测试,每当我尝试在任何输入中输入任何内容时,它都会变得迟钝......我认为这是关于 $watch 代码的性能问题。如果您对性能问题有任何确认(或没有),我很感激您分享!再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2014-09-25
    • 2017-11-13
    • 2014-03-07
    • 2012-12-06
    • 2018-09-05
    • 2010-12-04
    相关资源
    最近更新 更多