【问题标题】:Unable to get content AngularJs dynamic popover inside ngrepeat无法在 ngrepeat 中获取内容 AngularJs 动态弹出框
【发布时间】:2017-09-05 18:01:42
【问题描述】:

我需要显示一个小的弹出框,它应该在点击时打开,在点击页面上的任意位置时离开。

我找到了一个符合此要求的 plunker (http://plnkr.co/edit/K7cYQSDEBS3cHvDfJNLI?p=preview),但无法让它在 ng-repeat 中工作。

我看到了几个答案和 Plunker 示例,但无法使其正常工作。

这是我的html

<div ng-controller="TestController">
<div class="row" style="background-color: #ebebeb !Important; ">
    <div style="text-align:center">
    <table style="width:100% !important;">
        <tr ng-repeat="member in TeamMembers" style="font-size:18px !important; height: 108px;">
        <td style="display:block;margin-top:30px;text-align:left;">&nbsp;{{member.FirstName}} {{member.LastName}} <i class="fa fa-info-circle" aria-hidden="true" ng-show="member.Description != null" popover-template="dynamicPopover.templateUrl"  popover-placement="bottom" popover-elem descr="{{member.Description}}"></i></td>
        </tr>
    </table>
    </div>
</div>

...

<script type="text/ng-template" id="descriptionModal.html">
    <div class="adp-info-dialog">
        <div class="modal-body">
        <div class="row">
            <div class="col-md-8 col-md-offset-1">
            <div class="form-group">
                <label class="fieldset-label">Test {{ dynamicPopover.descr }}</label>
            </div>
            </div>
        </div>
        </div>
    </div>
</script>

这里是 JS

testApp.controller('TestController', function ($scope, $rootScope, $log, $modal, SiebelAccountTeamService, $filter, $element) {
$scope.dynamicPopover = {
    templateUrl: 'descriptionModal.html',
    descr: null
};
var result = TestService.GetTeamMembers();
result.then(function (data) {
    $scope.TeamMembers = data.data;
}, function (e) {
    console.log(e);
}).finally(function () {
    $scope.CompleteLoading();
});   

});

testApp.directive('popoverClose', function ($timeout) {
return {
    scope: {
        excludeClass: '@'
    },
    link: function (scope, element, attrs) {
        var trigger = document.getElementsByClassName('trigger');

        function closeTrigger(i) {
            $timeout(function () {
                angular.element(trigger[0]).triggerHandler('click').removeClass('trigger');
            });
        }

        element.on('click', function (event) {
            var etarget = angular.element(event.target);
            var tlength = trigger.length;
            if (!etarget.hasClass('trigger') && !etarget.hasClass(scope.excludeClass)) {
                for (var i = 0; i < tlength; i++) {
                    closeTrigger(i)
                }
            }
        });
    }
};

});

testApp.directive('popoverElem', function () {
return {
    scope: {
        descr: '@'
    },
    link: function (scope, element, attrs) {            
        $scope.dynamicPopover.descr = scope.descr,
        alert($scope.dynamicPopover.descr),
        element.on('click', function () {
            element.addClass('trigger');
        });            
    }            
};

});

感谢您的帮助。

【问题讨论】:

    标签: angularjs angularjs-ng-repeat popover


    【解决方案1】:

    更新:

    为了在popover内容中显示ng-repeat的数据,我们需要通过ng-repeat$index访问各个对象。请参考以下示例。

    Plunkr Demo

    这里的问题是你使用的是ng-repeat creates a new scope阅读更多here

    由于用您的代码复制问题很乏味,我尝试用 plunkr 复制问题!

    解决方案:

    Plunkr Demo

    您可以像这样在descriptionModal.html 中简单地定义一个新控制器

    HTML:

    <script type="text/ng-template" id="myPopoverTemplate.html">
          <div class="adp-info-dialog" ng-controller="tester">
            <div class="modal-body">
            <div class="row">
                <div class="col-md-8 col-md-offset-1">
                <div class="form-group">
                    <label class="fieldset-label">Test {{ $parent.$parent.dynamicPopover.content }}</label>
                </div>
                </div>
            </div>
            </div>
        </div>
        </script>
    

    JS:

    app.controller('tester', function ($rootScope, $scope) {
      console.log($scope.$parent.$parent.dynamicPopover.title);
    });  
    

    然后,我们就可以访问父作用域了,使用$parent,上面脚本里面的html使用$parent来获取变量!

    请注意:我花了两个 $parent 才到达所需的 $scope 以访问范围变量。在您的场景中,它还需要两个,检查需要多少的方法是使用console.log($scope),然后打开控制台(F12),然后遍历对象$parent 属性,直到找到正确的 $scope。然后计算遍历的$parent 的数量,这将是您需要遍历的$parent 的数量!

    附注:

    还有另一种方法可以做到这一点,因为这种方法需要大量重写你的代码,我将提供 GIST,你可以使用 controller as 语法并访问正确的范围。

    这是给出方法的 SO Answer

    SO Answer

    我希望这可以解决您的问题。

    【讨论】:

    • 我很抱歉没有提供 Plunker。我可以通过将它添加到指令中来完成这项工作:scope.$parent.dynamicPopover.descr = scope.descr;但是,虽然这确实显示了内容 - 内容不会随着基于数据的变化而变化。它会拾取最后的内容并继续显示。
    • 不 - 不幸的是 - 内容不会根据 ng-repeat 中的数据而改变。最后一项的值是弹出窗口中显示的值。
    • @codelearner 抱歉,我没有从这个角度思考,更新了我对新要求的回答!
    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多