angularjs:控制器劫持另一个控制器';s变量
我面临一个非常奇怪的问题,一个控制器中的变量被另一个控制器劫持。详情如下: 在我的HTML中,我有两个ng视图标记。每个标记都指向一个templateURL(一个html),它有自己相应的控制器。Ctrl1和Ctrl2 这两个ng视图在html层次结构中处于同一级别,也就是说,一个视图不是另一个视图的子视图 控制器1如下所示: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
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知识进行编码的缺点。不用担心。阅读并使用它。它会帮助你抓住错误,教你什么不该做。此外,阅读这本书。