在Angular运行之前有没有办法运行Javascript代码?

时间:2014-05-19 07:24:09

标签: javascript jquery angularjs angularjs-directive

我希望以编程方式将ng- * HTML属性添加到各种DOM元素中。我使用$compile(obj)($scope);取得了一些成功,但这种二次编译会导致许多组件出现问题。

我通过jQuery添加了ng- *属性......是的,我知道,指令,但这对我不起作用,因为我添加的ng- * HTML属性是基于DOM结构的样板操作。与jQuery DOM操作相比,这些和指令看起来很笨拙(至少可以说)。

所以...有没有什么办法可以在Angular运行之前添加这些样板ng- * HTML属性,以便我可以避免重新$compile?我真正喜欢的是一种在Angular上做一个pre-init钩子的方法,有没有这样的野兽?

SOLUTION:

@ChrisMartin让我走上正确的道路,找出这个问题的答案(谢谢Chris!)。我最终做的是......

首先,我创建了一个名为“angular-defer-bootstrap.js”的文件,其中包含 “angular.js”之前的代码:

//# Set the window.name to signal Angular to delay bootstrapping until `angular.resumeBootstrap()` is called.
//#     See: http://stackoverflow.com/a/21049890/235704 and https://docs.angularjs.org/guide/bootstrap
//#     NOTE: This MUST be included BEFORE angular*.js
window.name = 'NG_DEFER_BOOTSTRAP! ' + window.name;

然后我用jQuery创建了以下函数来预先形成任何 pre-Angular bootstrap 代码:

//####################
//# Setup the jQuery onDocumentLoad event to handle the pseudo-ng-directive of ng-preinit
//####################
$(document).ready(function () {
    var $this, $pre = $('[ng-preinit]');

    //# If we have some [ng-preinit]'s to process
    if ($pre.length > 0) {
        //# Traverse the [ng-preinit] attributes, eval'ing/running each and removing them so Angular doesn't freak out
        $pre.each(function() {
            $this = $(this);
            eval($this.attr('ng-preinit'));
            $this.removeAttr('ng-preinit');
        });
    }

    //# Let Angular know it can .resumeBootstrap and remove the flag from window.name
    angular.resumeBootstrap();
    window.name = window.name.replace('NG_DEFER_BOOTSTRAP! ', '');
});

然后通过包含ng-preinit伪Angular指令/ HTML属性来使用它:

<div class="row" ng-controller="IndexController" ng-init="init()" ng-preinit="globalScope.preinit()">

这里的问题是伪Angular指令eval中包含的ng-preinit'd代码具有全局范围,而不是Angular控制器的$scope

使用这几行代码,我现在可以干净地挂钩Angular的“pre-init”(即pre-bootstrap)并做任何我喜欢的事情,而无需重新$compile(而且它是意想不到的后果),完全我想要的东西!

1 个答案:

答案 0 :(得分:1)

Angular's documentation on manual initialization中解释了这一点。

  

如果您需要对初始化过程有更多控制权,可以使用手动引导方法。您需要执行此操作的示例包括使用脚本加载器或在Angular编译页面之前执行操作的需要。