【问题标题】:AngularJS ng-model form driven by ng-repeat over UI model description data how to?由ng-repeat驱动的AngularJS ng-model表单对UI模型描述数据如何?
【发布时间】:2013-07-24 09:29:34
【问题描述】:

JSFiddle http://jsfiddle.net/vorburger/hyCTA/3/ 展示了我对 AngularJS 的(工作)“UI 建模”想法;请注意,表单实际上并未在 HTML 模板中编码,它由 uimodel JSON 驱动(反过来描述了如何呈现/编辑数据模型):

<div ng-repeat="auimodel in uimodel">
    <label>{{$index + 1}}. {{auimodel.label}}</label>
    <input ng-model="datamodel[auimodel.model]" type="{{auimodel.type}}" />
</div>

问题是,一旦我的“模型”不是一个简单的属性,而是一个“路径”,那么我的方括号动态键“技巧”当然就不再起作用了。 )http://jsfiddle.net/vorburger/8CxRC/1/JSFiddle。有什么建议可以做到这一点吗?

PS:或者这样的事情是否一定需要一个完整的自定义指令而不是迟早?如果可能的话,我宁愿不必这样做,以使此类 UI 模型“元模板”的创建和维护尽可能简单......

【问题讨论】:

    标签: javascript angularjs directive


    【解决方案1】:

    我自己想出了一个(但可能不是最好的?)方法来实现这一点。见http://jsfiddle.net/vorburger/8CxRC/3/ - 基本上仍然基于我的方括号动态键“技巧”,但有一些预处理:

       for (var i = 0; i < $scope.uimodel.length; i++) {
            var resolvedModelProperty = $scope.datamodel;
            var remainingPath = $scope.uimodel[i].model;
            while (remainingPath.indexOf('.') > -1) {
                var nextPathSlice = remainingPath.substr(0, remainingPath.indexOf('.'));
                resolvedModelProperty = resolvedModelProperty[nextPathSlice];
                remainingPath = remainingPath.substr(remainingPath.indexOf('.') + 1);
            }
            $scope.uimodel[i].modelB = resolvedModelProperty;
            $scope.uimodel[i].modelL = remainingPath;
        }
    

    【讨论】:

    • 虽然这行得通,但它并不能解决jsfiddle.net/vorburger/8CxRC/4 上说明的输入/名称+ span/ng-show 的相关问题......不知何故它可能被绑定得太早或类似的东西?非常感谢 AngularJS 超级大师向导的任何帮助!
    • 感谢@sza 对another Q 的帮助,它现在可以在latest fiddle 中使用
    • duh,只是有点工作..Fiddle #7 说明动态设置输入类型仍然是 NOK :(。希望Issue 1404 能彻底解决这个问题。
    【解决方案2】:

    你和我自己的项目Metawidget 是一样的。 Metawidget 相当于你所追求的,由 metawidget.angular.widgetprocessor.AngularWidgetProcessor 覆盖:

    https://github.com/metawidget/metawidget/blob/master/modules/js/angularjs/src/main/webapp/lib/metawidget/angular/metawidget-angular.js

    虽然我没有发现需要使用方括号表示法(我只是做了 foo.bar.baz)。还有魔法线:

    $compile( widget )( scope.$parent );
    

    这会将您动态实例化的原始 HTML 转换为功能齐全的 Angular 代码。

    如果您有机会查看 Metawidget,非常感谢您的反馈!教程开始here

    【讨论】:

    • 嗨,听起来很有趣,但是..我(还)不能够理解如何将您的 AngularWidgetProcessor 等应用到我的方法中.. 在 Metawidget 中,您并没有真正的“元模板” “就像在我的设计中一样(或者我误解了?) - 那么我会在哪里做呢?我认为您没有时间调整我的 JSFiddle 来说明您的意思吗? ;-)(或者甚至显示我用 Metawidget 重写的完整 github.com/vorburger/MUI.js?)
    • 当然,这是您使用 Metawidget 的 JSFiddle:jsfiddle.net/8CxRC/10 Metawidget 的模板是以编程方式完成的(参见 metawidget.layout.TableLayout),而不是在您的 HTML 页面中,因为这让我们可以做类似 a) 业务布局中的逻辑和 b) 将多个布局组合在一起,例如围绕不同部分的选项卡
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2017-05-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多