【问题标题】:How to bind scope data to model that is generated dynamically using Javascript?如何将范围数据绑定到使用 Javascript 动态生成的模型?
【发布时间】:2016-07-16 03:51:42
【问题描述】:

我的场景是通过传递从脚本标签传递的数据使用 javascript 创建动态表。我的 javascript 代码解析提供的 json 并生成表头和表体。表格体与角度绑定方法{{variable_name}}所需的标签一起生成。

但是在创建 DOM 之后,我需要将范围重新应用到表的ng-repeat。

<html>
<head>
<title>dynamic table</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">
    <script src="js/angular.min.js"></script>
    <script src="js/jquery.min.js"></script>

<script type="text/javascript">
var orderByField = "impressions";
var reverseSort = "false";
var myList = [{firstName: 'John',lastName: 'Doe',age: 30,etc : 'heelo'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Sue',lastName: 'Banter',age: 21,etc: 'cool'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'},{firstName: 'Frank',lastName: 'Burns',age: 54,etc: 'world'}];


function addAllColumnHeaders(myList, selector)
{   
    var columnSet = [];
    var headerTr$ = $('<tr/>');
    var aStart = '<a href="#" ng-click="orderByField=\'';
    var aMid = '\'; reverseSort = !reverseSort">';
    var aEnd = '</a>';

    for (var i = 0 ; i < myList.length ; i++) {
        var rowHash = myList[i];
        for (var key in rowHash) {
            keyLink = aStart+key+aMid+key+aEnd;
            if ($.inArray(key, columnSet) == -1){
                columnSet.push(key);
                headerTr$.append($('<th/>').html(keyLink));
            }
        }
    }
    $(selector).append(headerTr$);
    return columnSet;
}

function createAngularTableDataPlaceholder(myList, selector)
{
    var columnSet2 = [];
    var headerTr2$ = $('<tr/>').attr('ng-repeat','field in myList|orderBy:orderByField:reverseSort');
    var aStart2 = '<td>{{field.';

    var aEnd2 = '}}</td>';

    for (var i = 0 ; i < myList.length ; i++) {
        var rowHash2 = myList[i];
        for (var key2 in rowHash2) {
            keyLink2 = aStart2+key2+aEnd2;
            //alert(keyLink);
            if ($.inArray(key2, columnSet2) == -1){
                columnSet2.push(key2);
                headerTr2$.append($('<td/>').html(keyLink2));
            }
        }
    }
    $(selector).append(headerTr2$);
    return columnSet2;
}
</script>
</head>
<body>
<div class="container">
<section ng-app="app" ng-controller="MainCtrl" ng-init="getMember(myList)">
<table class="table" id="excelDataTable" border="1">
            <thead id="thead">

            </thead>
            <tbody id="tbody">
              <!--tr ng-repeat="field in myList|orderBy:orderByField:reverseSort">

              </tr-->
            </tbody>
  </table>
  </section>
  </div>

  <script>
    var app = angular.module('app', []);

        app.controller('MainCtrl', ['$scope', '$window', function($scope, $window) {        

                addAllColumnHeaders(myList, '#thead');
                createAngularTableDataPlaceholder(myList, '#tbody');
                console.log("header and columns done");

                $scope.orderByField = $window.orderByField;
                console.log($scope.orderByField);

                $scope.reverseSort = false;
                console.log($scope.reverseSort);

                angular.element(document).ready(function () {
                $scope.myList = $window.myList;
                console.log("got "+$scope.myList);
            });

        }]);    
    </script>

</body>
</html>

创建的 dom 元素如下 -

我得到的当前输出是 - 但问题是 Angular 在渲染时绑定了它的所有代码。 javascript 完成后,如何使用$scope.watch 方法或$scope.apply 方法完成此操作。 我正在尝试使用

angular.element(document).ready(function ())

但这不是我认为的正确方法。
我是角度的新手。请指导我。谢谢!

【问题讨论】:

  • 你不应该首先使用 jQuery 创建 dom。数据应该传递到控制器中,让 Angular 构建 dom
  • 我会把你所有的 js 逻辑放在角度控制器中
  • 谢谢@charlietfl 和贾斯汀。这似乎更符合逻辑。我将所有代码传递给控制器​​以构建 dom。但仍然是同样的错误。因为我认为 ng-app 是在之前渲染的,而组件是在以后创建的?
  • 您需要一个ng-repeat 来填充该表。大多数教程都会显示这一点。逐步浏览 Angular 文档网站上的教程。以后了解基础知识会为你省去很多问题

标签: javascript html angularjs dom angularjs-scope


【解决方案1】:

你可以在渲染 DOM 树后引导 Angular。只需从部分中删除 ng-app 并将此代码放在第一个脚本的末尾:

var elem = document.querySelector('section');
angular.bootstrap(elem, 'app');

当然,使用更好的方法来选择要绑定 ng-app 的元素

【讨论】:

  • 所有这一切都会在一个设置不佳的应用程序上扔一个创可贴
  • 感谢@bohdan,这就是我可以修补我相信的代码的方法。我在该部分添加了一个 id 以正确选择部分标签,并尝试使用引导,但没有成功。我应该把这个放在哪里?
  • @devutkarsh ,在第一个代码的末尾。但可能现在你的 Angular 模块代码应该先行。所以第一个脚本标签 angular.module('app')... 第二个脚本 - 你的 dom 渲染。但也最好使用控制台。角度通常会引发可以理解的错误,您应该阅读它
  • 但不要忘记从部分中删除 ng-app='app',让 angular.bootstrap 来做这些事情
猜你喜欢
  • 2012-12-13
  • 2018-11-16
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多