这是我的指令: app.directive('popov-6ren">
gpt4 book ai didi

javascript - AngularJS 指令范围和 $compile - 返回空白的变量

转载 作者:行者123 更新时间:2023-11-29 14:54:57 24 4
gpt4 key购买 nike

有一个我无法弄清楚的 Angular 问题。我怀疑这可能与范围有关,但我不是 100% 确切。

这是我的 HTML:

<i class="icon-question-sign" popover data-placement="top" data-trigger="hover" data-title="Top 10 clients" data-content-compile="<ul><li ng-repeat='client in user.clients | limitTo: 10'>{{client}}</li></ul>"></i>

这是我的指令:

app.directive('popover', function($timeout, $compile) {
var linker = function (scope, element, attrs) {
$timeout(function() {
var content = $compile(element.data('content-compile'))(scope);
element.popover({
'html': true,
'content': content
});
}, 200);
}

return {
restrict: 'A',
link: linker
}

});

结果正确地将 li 重复到 {{user.clients}} 的正确长度,但不呈现 {{client}}。出于某种原因,它显示为空白,但它有一个字符串值,并且在直接添加到 HTML 而不是通过指令编译时可以工作。它目前在 DOM 中的样子:

<ul class="ng-scope"><!-- ngRepeat: client in user.clients | limitTo: 10 --><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li><li ng-repeat="client in user.clients | limitTo: 10" class="ng-scope"></li></ul>

如果我将 {{client}} 替换为 {{user.email}},它会正确列出。

不确定这里发生了什么 - 我可能遗漏了一些明显的东西!

最佳答案

你的问题的关键是它的原因:data-content-compile 中的 {{client}} 在指令启动之前被编译,所以 client 在 Controller 上下文。目前,您发送到 $compile 的字符串是:

<ul><li ng-repeat='client in user.clients | limitTo: 10'></li></ul>

为了防止这种情况,必须以其他方式将模板发送到指令中。这里有一些:

  1. 将模板作为字符串存储在 Controller 中。在我看来相当丑陋。
  2. 将模板存储在模板中并从 $templateCache 中检索它。

我做了an example using second approach :

<div ng-controller="ctrl">
<script type="text/ng-template" id="client.html">
<div><ul><li ng-repeat='client in user.clients'>{{client.name}}</li></ul></div>
</script>
<i
popover
class="glyphicon glyphicon-user"
data-placement="bottom"
data-trigger="hover"
data-title="Top 10 clients"
data-content-template="client.html"
></i>
</div>
angular.module("app", [])
.controller("ctrl", function($scope, User) {
$scope.user = User;
})
.directive("popover", function($compile, $timeout, $templateCache) {
return function(scope, el, attr) {
$timeout(function() {
el
.popover({
html: true,
content: $compile($templateCache.get(attr.contentTemplate))(scope)
})
.popover("show")
});
};
})
.value("User", {
clients: [
{ name: "John", age: 22},
{ name: "Ann", age: 13},
{ name: "Maria", age: 62},
{ name: "Ivan", age: 44}
]
});

关于javascript - AngularJS 指令范围和 $compile - 返回空白的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19439875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com