【问题标题】:Angular Js $compile Javascript Window ScopingAngular Js $compile Javascript 窗口范围
【发布时间】:2016-02-26 13:06:34
【问题描述】:

我在 angular-ui 引导模式内的 this 范围内遇到问题。当我在模式之外运行以下代码时,我没有遇到任何问题:

  var GlobalVariable = GlobalVariable || {};

    (function(){

      doSomethingWith(GlobalVariable.field);

    })();

在 $modal GlobalVariable.field 之外调用时是完全可以访问的。一旦我在 $modal 中运行此代码,GlobalVariable.field 就未定义。现在我可以通过直接访问 $modal 对话框中的 window.GlobalVariable.field 来解决这个问题,但问题是在这种情况下 doSomethingWith 方法是需要访问全局变量的第 3 方库。我不打算浏览所有第三方库并添加“窗口”。作用于所有全局范围的变量。

我知道,当我调用 $modal.open 并传入一些 HTML 时,它会通过 angular $compile 函数(我假设eval()s HTML 作为该过程的一部分)被破坏。我的猜测是,当 $compile 处理它时,它会为其分配一个新的 this 对象,这意味着我们不会从 window 继承所有全局范围的变量。

有什么方法可以让 Angular 的 $compile 强制将窗口的全局变量“继承”到我的模式?

【问题讨论】:

    标签: javascript angularjs closures


    【解决方案1】:

    看看我从 Angular-UI 引导文档生成的这个 Plunker:

    http://plnkr.co/edit/jMcvTBDcrkPU7p4gFejT?p=preview

    resolve
    

    如您所见,模态框创建了一个新范围,因此您想在该范围内使用的任何内容都必须使用“resolve”传入并返回。当你可以传入任何你需要的东西时,没有必要强制继承。

    【讨论】:

    • 不幸的是,这并没有回答我的问题。这是关于获得对与window 关联的所有 Javascript 全局变量的访问权限。它不是特定于角度的,它恰好是角度,即$compile-ing HTML/Javascript。
    • 在注入模态的 HTML 中声明了变量吗?
    • 变量在模态框外的页面中声明。它是一个独立于角度声明的网站范围的对象。重要的一点是,我需要我在模态中的代码对它是否显示在 $modal 中保持无动于衷(这就是为什么我不能将变量分配给 $scope.new() 或使用 $modal resolve 功能) .
    • 有趣,我得看一个更具体的代码示例。我按照您所说的更新了 Plunker(添加了一个名为 someGlobal 的 var,添加了一个按钮,该按钮调用我在模态控制器中添加的函数,该函数对 someGlobal 的值执行 window.alert)。再看看plnkr.co/edit/jMcvTBDcrkPU7p4gFejT?p=preview - 这与您正在做的事情相符吗?
    • plnkr.co/edit/hpQJnKcm8PcSpHt5eY0j - 这个 plunkr 的设置方式与我设置的方式基本相同。不幸的是,我卡在模态中的 Javascript 根本没有被执行。不太清楚那里发生了什么,但它让您了解我们正在尝试做的事情。
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2013-05-03
    • 2017-02-13
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多