【问题标题】:Recompile block modified by external scripts重新编译外部脚本修改的块
【发布时间】:2014-08-13 11:01:54
【问题描述】:

我必须使用修改我的 DOM 的框架。以下是一些使用的 HTML 示例:

<div id="testID" ng-show="example === 'show'">Some Content</div>

会被框架修改成这样的:

<div id="wrapperOne">
    <div id="wrapperTwo">
        <div id="testID" ng-show="example === 'show'">Some Content</div>
    </div>
</div>

这可以通过调用像这样的 JS 函数来完成:

framework.wrap($("#testID"));

如您所见,该框架将旧的 HTML 与一些其他元素包装在一起。 我的问题是,当 $scope.example 变为“显示”时,Angular 不显示 div。在不使用框架的情况下,它可以正常工作,我认为问题在于,在框架更改 DOM 之前,Angular 会编译 DOM。框架必须等待一个 ajax 请求,所以仅仅在它之后包含 angular 脚本是行不通的。

我正在寻找一种解决方案来强制 Angular “重新编译”整个 DOM,最好是其中的某些部分。 这是正确的建议,还是有其他方法可以做到这一点?仅仅省略框架不是解决方案,因为我必须使用它。

非常感谢,

-卢卡斯

【问题讨论】:

  • 如果不提供更多代码来展示您如何在应用程序中使用框架,则不太可能获得太多帮助

标签: javascript jquery angularjs dom


【解决方案1】:

使用自定义 directiveng-transclude

我创建了一个小提琴 - http://jsfiddle.net/zghuoxhb/2/

指令:

.directive('myWrapper', function () {
    return {
        restrict: 'E',
        templateUrl: "my-wrapper-template.html",
        replace: true,
        transclude: true,
        scope: false
    };
})

html:

<my-wrapper>
    <div id="testID" ng-show="example === 'show'">Some Content</div>
</my-wrapper>

输出:

顺便说一句,很好的问题,这是一个很好的用例来展示 Angular 的精彩

【讨论】:

  • 非常感谢,这听起来很不错。唯一的问题是,包装器 div 是由上述框架生成的,因此将 ng-transclude 标记添加到它们会很脏,因为我必须在 div 生成后使用一些 javascript 插入它。有没有办法在包装器 div 中没有这个 ng-transclude 标签?
  • @LukasKolletzki:请根据您的情况创建一个 jsfiddle
  • 好的,我解决了这个问题,告诉框架的创建者实现ng-transclude标签。非常感谢!
猜你喜欢
  • 2015-08-19
  • 2021-08-19
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多