angular 中的动态模板与 qtip

Dynamic template in angular with qtip

为了显示一些用户信息,我正在使用捕获点击事件的指令来显示 qTip tooltip. As I am already using angular, to render the HTML I am using $compile 以呈现 HTML。

.directive('myDirective', function ($compile, $timeout) {
    return {
        restrict: 'AE',
        link: function (scope, element, attrs) {
            // Open qTip popup
            element.qtip({
                content: {
                    ajax: {
                        url: '/myurl',
                        type: 'GET',
                        dataType: 'json',
                        success: function (data, status) {
                            // Contact full name
                            scope.FullName = data.contact.Forename + ' ' + data.contact.Surname;

                            var myelement = angular.element('<p>[[ FullName ]]</p>');
                            var compiled = $compile(myelement)(scope);

                            this.set('content.text', compiled)
                        }
                    }
                },
                show: 'click',
                style: {
                    classes: 'qtip-bootstrap'
                },
                hide: {
                    event: 'unfocus'
                }
            });
        }
    };
});

问题是 HTML 只渲染了几次,而在其他情况下我可以看到 angular 标签出现。似乎编译器输出没有及时呈现。为了解决,我找到了一个使用超时的解决方案,如下面的代码所示。

...
success: function (data, status) {
  // Contact full name
  scope.FullName = data.contact.Forename + ' ' + data.contact.Surname;

  var myelement = angular.element('<p>[[ FullName ]]</p>');
  var compiled = $compile(myelement)(scope);

  $timeout(this.set('content.text', compiled), 100); // delay 100 ms
}
...

我的问题是我觉得这个解决方案不是很有效,我想知道是否有更好的替代方法。任何帮助将不胜感激。

$timeout(this.set('content.text', compiled), 100);

你的超时函数是错误的,因为它会立即执行。但它之所以有效,是因为缺少的部分是启动 angular digest 进程来更新 GUI,因为 qTip 运行 在 angular 生命周期之外。 $timeout 将隐式调用 digest 函数。

试试这个:

this.set('content.text', compiled)l
scope.$digest();

超时函数的正确实现:

var that = this;
$timeout(function() {
    that.set('content.text', compiled);
}, 100);