【问题标题】:Adding HTML to a directive on the ng-click of a button of the same directive in AngularJS在AngularJS中相同指令的按钮的ng-click上将HTML添加到指令中
【发布时间】:2014-08-25 13:05:34
【问题描述】:

我想在单击“添加其他行”按钮时向 div“#rowContainerXXX”添加另一行。我想我必须使用“$compile”编译指令的新 html。我尝试了几个从堆栈溢出的链接来实现这一目标,但未能成功。我尝试了两种不同的方法。一种使用链接函数概念,另一种是编译函数。请指导我通过一些概念来实现我的目标。我实现添加新行的方式在没有链接和编译功能的情况下工作正常。但问题是“ng-click=removeRow()”不适用于新添加的行。 “removeRow”仅适用于指令的第一行。任何帮助表示赞赏。

这是指令的 HTML

<div class="contactItem">
    <h3>{{contact.title}}<span class="required-field">*</span></h3>
    <div class="item">
        <div id="item-header">
            <span class="dataText">Name</span>
            <span class="dataText">Role/Title</span>
            <span class="dataText">Email</span>
            <span class="dataText">Phone</span>
        </div>

    </div>
    <div class="item" id="rowContainer{{contact.id}}">
        <div id="row{{contact.id}}_0">
            <input class="dataItem" type="text" ng-model="contact.name" />
            <input class="dataItem" type="text" ng-model="contact.role" />
            <input class="dataItem" type="email" ng-model="contact.email" />
            <input class="dataItem" type="text" ng-model="contact.phone" />
            <input class="dataItem lastHidden" type="button" ng-click="removeRow()" value="Remove" />
        </div>
    </div>
    <div class="item">
        <div class="addContactButton">
            <input type="button" ng-click="addRow(contact.id)" value="Add additional Row" />
        </div>
    </div>
</div>

这是指令的Java脚本

   app.directive('contactItem', function ($compile) {
    var rowId = 1;
    return {
        restrict: 'E',
        replace: true,
        templateUrl: 'templates/directives/contactItem.html',
        scope: {
            contact: '=',
        },
        controller: function ($scope) {
            $scope.addRow = function (rowContainerID) {
                var containerID = "#rowContainer" + rowContainerID;
                var rowContainer = $(containerID);
                var row = $("#row" + rowContainerID + "_0").html();
                var newRow = "<div id=\"row" + rowContainerID + "_" + rowId + "\">" + row + "</div>";
                //$compile(newRow)($scope);
                rowContainer.append(newRow);
                rowId++;
                var rows = $(containerID).children();
                if (rows.length > 1) {
                    $(containerID + " .lastHidden").addClass("last");
                    $(containerID + " .lastHidden").removeClass("lastHidden");
                }
                //console.log($(containerID).html());
                //$compile($(containerID).html())($scope);
            };

            $scope.removeRow = function () {
                console.log("Remove called");
            };
        },
        //link: function (scope, ele, attrs) {
        //    scope.$watch('rowId', function (html) {
        //        ele.html(html);
        //        $compile(ele.contents())(scope);
        //    });
        //},
        compile: function (element, attrs) {
            return function (scope, element, attrs) {

                console.log(element.contents());
                $compile(element.contents())(scope);
            };
        },
    }
});

【问题讨论】:

  • 为此创建 jsfiddle

标签: angularjs angularjs-directive


【解决方案1】:

只需将联系人存储在数组中并 ng-repeat 即可。因此,当您想添加行时 - 您只需将 .push(row) 放入数组中。它会出现。

<div class="item" id="rowContainer{{contact.id}}">
    <div ng-repeat="contact in contacts" id="row{{contact.id}}_0">
        <input class="dataItem" type="text" ng-model="contact.name" />
        <input class="dataItem" type="text" ng-model="contact.role" />
        <input class="dataItem" type="email" ng-model="contact.email" />
        <input class="dataItem" type="text" ng-model="contact.phone" />
        <input class="dataItem lastHidden" type="button" ng-click="removeRow()" value="Remove" />
    </div>
</div>


.directive(
    ...
    scope: {contacts: '='},
    ...
        $scope.addRow = function (rowContainerID) {
             var contact = makeEmptyContact();
             $scope.contacts.push(contact);
        };
    ...

【讨论】:

  • 感谢您的回复。让我试试这种方法。我刚刚编辑了我的帖子。实际问题是 ng-click 不适用于我使用过的方法新添加的行。我现在要试试你的方法,然后告诉你。谢谢。
  • 谢谢。上述方法效果很好。无需编译或链接功能。
猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2018-09-07
  • 1970-01-01
相关资源
最近更新 更多