【问题标题】:Angularjs bind dynamic form bulit in jsAngularjs在js中绑定动态表单
【发布时间】:2015-05-01 15:53:00
【问题描述】:

我有一个表单,我想在运行时通过 js 构建并在 angularjs 的表单控制器中使用它。
正如您在以下示例中看到的,它没有作为 html 被抛出,我希望它绑定到 model 变量。 http://jsfiddle.net/g6m09eb7/

<div>
    <form ng-controller="TodoCtrl" ng-submit="blabla()">
        <div ng-repeat="field in fields">{{field.input}}</div>
    </form>
</div>

function TodoCtrl($scope) {
    $scope.model = {
        'FirstName': 'Test',
        'LastName': 'Test Last'
    }
    $scope.fields = [{
        input: '<input type="text" ng-model="model.FirstName">'
    }, {
        input: '<input type="text" ng-model="model.LastName">'
    }, ];
}

【问题讨论】:

    标签: javascript angularjs forms binding


    【解决方案1】:

    首先,为了提供信息,我将向您展示如何在您尝试完成这项工作时完成这项工作。这不是您应该用来解决整体问题的方法。此示例将获取文档中的 html,但不会使用 Angular 进行编译。为此,您必须有一个不同的指令,like this (click)。这是各种不好的方法。

    angular.module('myApp', [])
    .controller('TodoCtrl', function($scope) {
        $scope.fields = [{
            input: '<input type="text" ng-model="model.FirstName">'
        }, {
            input: '<input type="text" ng-model="model.LastName">'
        }, ];
    })
    // filter to make Angular trust the html
    .filter('safeHtml', ['$sce', function ($sce) { 
        return function (text) {
            return $sce.trustAsHtml(text);
        };    
    }])
    ;                     
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <form ng-app="myApp" ng-controller="TodoCtrl">
       <!-- use ng-bind-html on trusted html to bind it (see the js) -->
      <div ng-repeat="field in fields" ng-bind-html="field.input | safeHtml"></div>
    </form>

    相反,您可以自然而然地做到这一点。只需使用对象的属性作为ng-repeat 的标准。简单干净!

    angular.module('myApp', [])
    .controller('TodoCtrl', function($scope) {
      $scope.model = {
        'FirstName': 'Test',
        'LastName': 'Test Last'
      };
    })
    ;                     
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <form ng-app="myApp" ng-controller="TodoCtrl">
      <div ng-repeat="(key,value) in model">
          <input type="text" ng-model="model[key]"/>
      </div>
    </form>

    请务必避免将您的控制器与 DOM 操作相关联。如果您在控制器中有 html sn-ps,则您的方法可能偏离了轨道。 DOM 操作应该完全使用指令来完成。

    【讨论】:

    • 嗨,谢谢,我想生成表单的原因是因为它真的是动态的,并且在构建表单时有很多条件。无论如何,我把你的例子带到了 jsfiddle,你可以看到这些值没有绑定:jsfiddle.net/g6m09eb7/2
    • @SexyMF 这不是我的建议 =D 我强烈要求你不要那样做。第二个例子是正确的方法。看看我写的“这是各种不好的方法”。我解释说 html 不会被编译,并给你一个链接到可以解决这个问题的资源。最后,我讨论了指令负责 DOM 操作。根据您在本文之外的特定情况所涉及的复杂性,您可以编写自己的指令来处理它。
    • 哦,我刚刚看到你更新了。抱歉,我没有刷新页面。让我问你这个,在你的第二个例子中,我怎样才能让表单更加动态,有时我需要组合框/复选框/收音机/文本区域等等,你的例子让我想到了一个单一类型的字段。谢谢
    • @SexyMF 所以,听起来您是在说您有一些数据,并且您想使用一个公式将其转换为表格,对吧?您可以编写一个指令,该指令具有查看数据的逻辑并拉入正确的 html sn-ps。这让我想起了我在这里的回答:stackoverflow.com/a/20181150/1435655 看看并使用你在这里学到的东西。由于您刚刚开始使用 Angular,因此一开始可能很难理解其中的一些内容。只要继续修修补补和学习,你就会得到它。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多