【问题标题】:angularjs create html with data binding based on object properties and templateangularjs根据对象属性和模板创建带有数据绑定的html
【发布时间】:2016-07-31 22:02:56
【问题描述】:

我正在尝试在 angularjs 中创建一个 html 视图,用户可以在其中编辑对象属性上的一些值。我在服务中有一个模型对象,然后我还有另一个描述模型对象属性的对象。

描述对象有一个称为参数的对象数组,每个对象都有名称、描述、类型等属性,如下所示:

{
"name": "item",
"description": "An item",
"parameters": [{
    "name": "prop1",
    "wasNullable": false,
    "description": "a property",
    "type": "string",
    "isRequired": true
}, {
    "name": "prop2",
    "wasNullable": true,
    "description": "a property",
    "type": "string",
    "isRequired": true
}]

}

我想使用这些数据为要操作的对象构建一个视图。如果属性名称是一个字符串,我想要一个带有文本输入和标签的 html 模板,如下所示:

<label>{{ parameter.name</label>
<input type="text" placeholder="parameter.description"></input>

我希望能够将这些“类型模板”作为单独的 html 文件。

我在如何执行此操作和处理数据绑定方面遇到了麻烦。一种方法是对描述对象上的参数数组执行 ng-repeat,如下所示:

<div ng-repeat="param in $ctrl.definitions.parameters">
<div ng-switch="param.primitiveType">
    <div ng-switch-when="string">
        <string></string>
    </div>
    <div ng-switch-when="dateTime">
        <date-time></date-time>
    </div>
    <div ng-switch-when="enum">
        <enum></enum>
    </div>
</div>
<div ng-if="param.subTypes">
    <select ng-model="select.subType">
        <option ng-repeat="subType in property.subTypes">{{ subType.name }}</option>
    </select>
    <div ng-repeat="subType in property.subTypes">
        <properties type="subType" ng-if="select.subType === subType.name"></properties>
    </div>
</div>

这将解决我的问题,因为我可以为每种类型的属性使用组件,但我不知道如何将数据绑定到服务中存在的另一个对象。

另一种方法是将所有具有默认值的参数从描述对象添加到实际模型对象,然后对引用的模型对象执行 ng-repeat,但我无法使用这种切换到正确 html 的解决方案模板。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: angularjs templates object dynamic properties


    【解决方案1】:

    有多种解决方案,但最接近您提供的代码的应该是将数据传递到您的模板directives

    这实际上是使用directive的基础之一,你可以像这样从父级传递数据:

    <div ng-switch-when="string">
        <string param="param"></string>
    </div>
    <div ng-switch-when="dateTime">
        <date-time param="param"></date-time>
    </div>
    <div ng-switch-when="enum">
        <enum param="param"></enum>
    </div>
    
    .directive('string', function(){
        return {
            scope: {
                param: '='
            },
            controller: function ($scope) {
                console.log($scope.param);
            }
        }
    })
    

    【讨论】:

    • 如果我不使用一个描述属性的对象和一个我想要更改值的实际模型或实例的对象,这将起作用。在您的示例中,我会将输入绑定到描述对象,而不是实际模型。如果我在模型对象上使用 ng-repeat,这将起作用,但这意味着我无法根据参数类型属性执行 ng-switch。如果我不是很清楚我的意思,请原谅。
    • @Kristofer 您是否考虑过在获取这两个对象时将它们组合起来,然后让角度作用于单个结果对象?
    • @lcycool 是的,我考虑过这一点,但我无法弄清楚合并对象的外观或在这种情况下我将如何处理数据绑定。类似:{“name”:“item”,“type”:“defaultType”,“parameters”:[“name”:“age”,“description”:“年龄。”,“type”:“int” , "value" : 0 ]} 也许我可以在这里使用 value 字段来解决数据绑定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2014-10-20
    • 2021-11-25
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多