Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angularjs:控制器劫持另一个控制器';s变量_Angularjs_Angularjs Scope - Fatal编程技术网

angularjs:控制器劫持另一个控制器';s变量

angularjs:控制器劫持另一个控制器';s变量,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我面临一个非常奇怪的问题,一个控制器中的变量被另一个控制器劫持。详情如下: 在我的HTML中,我有两个ng视图标记。每个标记都指向一个templateURL(一个html),它有自己相应的控制器。Ctrl1和Ctrl2 这两个ng视图在html层次结构中处于同一级别,也就是说,一个视图不是另一个视图的子视图 控制器1如下所示: ngEpMod.controller('Ctrl1',[function() { selfX = this; abc = 'abc con

我面临一个非常奇怪的问题,一个控制器中的变量被另一个控制器劫持。详情如下:

在我的HTML中,我有两个ng视图标记。每个标记都指向一个templateURL(一个html),它有自己相应的控制器。Ctrl1和Ctrl2

这两个ng视图在html层次结构中处于同一级别,也就是说,一个视图不是另一个视图的子视图

控制器1如下所示:

    ngEpMod.controller('Ctrl1',[function()  {

    selfX = this; 

    abc = 'abc controller1';
    console.log(abc); // break point 1

    selfX.query = function() {
        console.log("abc=");
        console.log(abc);  // break point 2
        console.log("search query=");
        console.log(selfX.searchQ);
        lySP.searchHomes();

    };

}]);
控制器2如下所示:

    ngEpMod.controller('Ctrl2',[function()  {

    self = this; 
    abc = 'abc controller2';

}]);
这两个控制器在html中都使用“controller as”语法关联

Ctrl1中的query()方法在用户单击按钮(ng click)时激发

谜团:当我加载包含两个ng视图的html页面($state)时,我正在观察浏览器控制台。我注意到断点1处的abc值是“abc controller1”,但当query()方法被激发时,它会神秘地变为“abc controller2”。没有该名称的全局变量!据我所知,当页面布局时,首先创建Ctrl1,因此在断点1处,abc具有正确的值,然后创建Ctrl2,以某种方式将abc变量提升到高位!更奇怪的是,我首先用我的自变量(self=this)注意到了这个问题,然后我引入abc只是为了进一步检查


大师,我是个新手,非常感谢你的帮助

通过创建一个不带
var
(或ES6中的
let
)的变量,您已经创建了一个附加到窗口的全局变量:

abc='abc controller1'等于
window.abc='abc controller1'

当第一个控制器实例化时,它在窗口上声明变量
abc
。当第二个控制器实例化时,它更改全局
abc
变量内容

为了避免这种情况,请在两个控制器中定义
var abc

为了避免将来出现这种情况,在每个功能中添加减速,例如:

ngEpMod.controller('Ctrl2',[function()  {
   'use strict';

    self = this; 
    var abc = 'abc controller2';

}]);
当您犯此错误(任何其他错误)时,Strict模式将抛出错误。来自MDN:

首先,严格模式使得不可能意外地创建全局 变量。在普通JavaScript中,在赋值中错误键入变量 在全局对象上创建新属性并继续“工作” (尽管将来可能会失败:在现代JavaScript中很可能)。 会意外创建全局变量的赋值 在严格模式下抛出:


我会把下面的代码放到这个实例化上面的应用程序中(大多数现代浏览器应该理解这个语法进行调试)。在每个控制器构造函数中调用window.trackCtrl,然后在chrome或firefox中弹出打开控制台并键入printCtrls(),您应该可以在按顺序创建它们时获得打印输出

window.trackCtrl = (name) => {
  var newCtrl = {}
  newCtrl.name = name + '_' + performance.now()
  window.trackingCtrls = window.trackingCtrls || []
  window.trackingCtrls.push(newCtrl)
}

window.printCtrls = () => Array.isArray(window.trackCtrls) ? window.trackingCtrls.forEach(x => console.info(x)) : console.error('trackCtrls not defined')

这将发现错误,例如控制器加载顺序错误,或者代码或库的副本加载到同一页面上。性能API在这些情况下帮助很大=>

谢谢Ori-我刚刚将var添加到abc中,效果很好!我就是这样一个笨蛋——没有足够的javascript知识进行编码的缺点。不用担心。阅读并使用它。它会帮助你抓住错误,教你什么不该做。此外,阅读这本书。