ng-repeat导致不必要的定位副作用

时间:2014-08-20 09:02:38

标签: angularjs twitter-bootstrap

我正在创建一个动态创建twitter bootstrap popover的角度指令:

app.directive("detailsPopup", function () {
return {
    restrict: 'E',
    scope: { items: '='},
    template: '<i ng-click="onClick($event)">click me</i>',
    link: function(scope, element, attrs) {
        scope.onClick = function(e) {
            var html
            // with ng-repeat:
            html = '<div ng-repeat="item in items">{{item}}</div>';
            // without ng-repeat:
            //html = '<div>AAA</div><div>BBB</div><div>CCC</div><div>DDD</div>';
            $(e.target).popover({
                trigger: "manual", content: function() {                           
                    return $compile(html)(scope);
                }, html: true
            }).popover("show")
        };
    }

使用ng-repeat时,弹出窗口未正确定位。当它不使用时,一切正常。为什么ng-repeat导致不必要的定位副作用?任何想法如何解决?

这是小提琴:http://jsfiddle.net/vfw4v0Le/

更新:不想使用额外的库(AngularUI),以下方法对我有用:

app.directive("detailsPopup", function () {
return {
    restrict: 'E',
    scope: { items: '='},
    template: '<i ng-click="onClick($event)">click me</i>' +
        '<div class="hidden"><div ng-repeat="item in items">{{item.name}}</div></div>',
    link: function(scope, element, attrs) {
        scope.onClick = function(e) {
            $(e.target).popover({
                    trigger: "manual", content: function() {
                        return $(e.target).next("div").clone(true).removeClass("hidden")
                    }, html: true
                }).popover("show")
        };
    }
}});

因此,我们在构建主页面时评估整个弹出窗口内容,只是将其隐藏起来。在显示弹出窗口时,我们正在克隆相关内容。

1 个答案:

答案 0 :(得分:2)

在ng-repeat的情况下,弹出窗口会在呈现内容之前显示,因为它是动态的。因此,弹出窗口(使用左上角坐标)就好像它是空的一样,然后出现内容,使其位置不正确。 Angular UI Bootstap project 包含 directive for Bootstrap popovers 。根据{{​​3}},重新定位popover以适应动态内容并非易事。你最好直接使用他们现成的指令