Javascript 指令链接函数中未定义范围变量
我有一个指令,其中有一段代码:Javascript 指令链接函数中未定义范围变量,javascript,angularjs,angularjs-directive,ionic-framework,ionic,Javascript,Angularjs,Angularjs Directive,Ionic Framework,Ionic,我有一个指令,其中有一段代码: return { restrict: "E", scope: { moduleProgress: "=", modules: "=", parentScroll: "=" }, templateUrl: 'app/program/module.list.template.html', link: function(scope,el,attrs,ctrl,tf) {
return {
restrict: "E",
scope: {
moduleProgress: "=",
modules: "=",
parentScroll: "="
},
templateUrl: 'app/program/module.list.template.html',
link: function(scope,el,attrs,ctrl,tf) {
$templateRequest("app/program/chapter.list.template.html").then(function(template) {
var template = angular.element(template);
var elements = [];
console.log(scope);
attrs.$observe("modules", function(val) {
scope.modules.forEach(function(module) {
module.open = false;
});
});
出于某种原因,第一次导航到包含此指令的视图时,一切正常,但从第二次开始,我总是得到一个
无法调用未定义的错误方法'forEach'。我通读了一些关于SO的类似问题,其中提到插值属性在链接函数中不立即可用,因此他们建议使用$observe
。我甚至添加了一个console.log(scope)
,对象上显示了modules
属性。你知道可能是什么原因吗?应该是$scope.$watch
而不是attrs.$observe
作为$observe
所需的@
在指令的独立范围内,在html上应该是模块=“{module}}”
,对于大对象,DOM将变得混乱,因此我希望您使用有意义的$watch
代码
scope.$watch("modules", function(newVal) {
if(newVal){
scope.modules.forEach(function(module) {
module.open = false;
});
}
});
scope.modules
是一个数组。即使它不是一个有效的方法,问题是它说我的范围.modules
属性未定义。我想你只在包含插值的属性上使用$observe
(我很确定它总是返回字符串),即{}
。因此,不要认为这对数组有效。不过我可能错了。我从来都不需要使用它。是的,$observe
只用于插值(@)属性,我想这是一个解决方案。问题出在我的父控制器中,它在承诺之后定义了$scope.modules
,因此在指令链接时间内它还不可用。我可以$watch
查找属性或在resolve上获取数据,这就是我所做的。但是谢谢;)@Thiatt更新了答案..是的,如果检查将验证模块
值是否存在,很高兴听到它确实有帮助..请进行投票..谢谢:)经过一生的调试,我终于发现承诺的数据导致我的链接函数以未定义的值运行。