【问题标题】:Detect when an <ng-include src="..."> loads检测 <ng-include src="..."> 何时加载
【发布时间】:2014-08-20 05:34:35
【问题描述】:

我在模态框内使用&lt;ng-include&gt; 根据某些选项有条件地加载不同的内容。

当模式以一种模式 (heh) 或另一种模式启动时,或者当用户更改下拉菜单时,会选择内容。

在任何这些情况下,我的模板中这样的部分会加载正确的模态内容:

<!-- Load in the correct modal contents -->
<ng-include src="'modals/contents-'+ form.type +'.html'"></ng-include>

然后它会加载 modals/contents-addressForm.html 或任何情况。

诀窍是,不同的形式有不同的大小。当它们加载时,模态需要重新定位。

我在form.type 变量上尝试了$watch。这会检测模式启动时的更改和初始值,但重新定位发生得太快,因为 ng-include 尚未加载到内容中。我试过推迟,但这并不总是足够长的。我可以尝试任意长度的超时,但这似乎......任意。

有什么方法可以知道任何 ng-include 何时加载?下一个 ng-include 何时加载?

【问题讨论】:

    标签: javascript angularjs angularjs-ng-include deferred-rendering


    【解决方案1】:

    根据the docs,您应该能够通过监听名为$includeContentLoaded 的作用域事件来告知这一点。

    $scope.$on('$includeContentLoaded', function () {
        // it has loaded!
    });
    

    【讨论】:

    • 好棒!它说目标是“当前的 ngInclude 范围”。这些事件是在作用域树上冒泡还是在 DOM 树上冒泡?哦……或者都不是。我稍后会知道,但我今晚要退房。谢谢@GregL!
    • 他们冒泡了范围树。 Angular 源代码中的实际行是:currentScope.$emit('$includeContentLoaded');。我们知道$emit() 将事件向上发送到作用域链($broadcast() 从目标作用域向下发送它们)。通过访问作为第一个参数传递给作用域事件处理函数的$event 对象的targetScope 属性,可以访问“目标作用域”(事件发出/广播的原始作用域)。
    • 更新:在模态父范围内监听 $includeContentLoaded 事件效果很好。在某些情况下,我有很多内容区域,因此每当加载任何内容区域时,我都会对事件处理程序进行去抖动并重新定位模式。我也可以获得arguments[0].targetScope,但我无法找出原始触发 ng-include src 路径这个,可以吗?
    • 如果你使用多个包含它会触发很多次,所以要小心它。 @Miraage 的答案要好得多。
    【解决方案2】:

    阅读docs

    onload(可选)在加载新部分时评估的表达式。

    <!-- Load in the correct modal contents -->
    <ng-include src="'modals/contents-'+ form.type +'.html'"
                onload="myFunction()"></ng-include>
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2014-08-19
      • 2014-03-18
      • 2013-09-29
      • 1970-01-01
      • 2013-06-10
      • 2016-07-05
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多