gpt4 book ai didi

angularjs - 如何在编译内部指令之前修改嵌入的内容?

转载 作者:行者123 更新时间:2023-12-04 08:08:09 27 4
gpt4 key购买 nike

我想要做的是在插入 DOM 之前手动处理 transclude 并修改内容:

return {
restrict: 'E',
transclude: true,
template: '<HTML>',
replace: true,
link: function(scope, element, attrs, ngModelCtrl, $transclude) {

var caption = element.find('.caption');

$transclude(function(clone) {
console.log(clone);
clone.filter('li').addClass('ng-hide'); // this don't work
clone.addClass('ng-hide'); // same this one
clone.attr('ng-hide', 'true'); // same this one
$compile(clone)(scope.$new()).appendTo(caption);
caption.find('li').addClass('ng-hide'); // and this
});
}
}

在 angular.js 源代码中,我找到了这个例子:
  var templateElement = angular.element('<p>{{total}}</p>'),
scope = ....;

var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {
//attach the clone to DOM document at the right place
});

//now we have reference to the cloned DOM via `clonedElement`

但是当我添加 clonedElement.appendTo(caption);在链接功能内部,它只在内部添加带有 ng-repeat 的注释。

我需要这个,因为在这种情况下我需要隐藏所有元素
<dropdown>
<li ng-repeat="item in items"><a>{{item.label}}</a></li>
</dropdown>

我需要在编译前修改模板或在 ng-repeat 展开后修改 DOM。之前会更好,因为我将能够使用 ng-hide 指令而不是 ng-hide 类添加逻辑。

最佳答案

我意识到这个问题发布已经很长时间了,但我希望您会发现以下内容很有用。

我在这个(嵌入)业务中已经很长时间了,我尝试了一些方法来实现你@jcubic 需要的东西,最后我遇到了一个非常强大且非常简单的解决方案。

...
replace: false,
transclude: false,
compile: function( tElement, tAttributes ) {

// store your "transcluded" content of the directive in the variable
var htmlContent = tElement.html();
// then remove it
tElement.html('');

return function postLink(scope, elem, attrs) {
// then html var is available in your link!
var $html = $('<div />',{ html:htmlContent }); // for much easier manipulation (so you can use DOM functions - you can also manipulate directly on htmlContent string)

// so you can manipulate the content however you want
scope.myVariable = true;
$html.find('li').attr('ng-hide', 'myVariable'); // add native directive
$html.removeClass('inner-content').addClass('my-inner-content'); // add/remove class
$html.find('#myElement').attr('my-directive',''); // add custom directive etc. etc.

// after you finished you just need to compile your html and append your directive element - also however you want
// you also convert back $html to the string
elem.append( $compile( $html.html() )(scope) ); // append at the end of element
/* or:
elem.find('.my-insert-point').html( $compile( $html.html() )(scope) ); // append the directive in the specific point
elem.find('[my-transclude]').html( $compile( $html.html() )($parent.scope) ); // once the scope:true it will be the same as native transclusion ;-)
scope.variable = $html.html(); // or you can probably assign to variable and use in your template with bind-html-compile (https://github.com/incuna/angular-bind-html-compile) - may need $sce.trustAsHtml
*/
}
}
...

如您所见,您可以完全控制“嵌入”内容,甚至不需要嵌入! :-)

附言。我用 Angular 1.4 对其进行了测试。不确定它是否可以与 replace:true 一起使用(我懒得测试它,因为如果它不起作用,那会很麻烦)。您可以像通常在 compile 函数中使用的那样使用 pre 和 post 链接,并且您需要将 $compile 服务注入(inject)到您的指令中。

关于angularjs - 如何在编译内部指令之前修改嵌入的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24575596/

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