范围变量

问题描述:

我有有这样一段代码指令:范围变量

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; 
       }); 
      }); 

出于某种原因,我第一次浏览到包含该指令一切正常的观点,而是从第二次起,我总是得到一个Cannot call method 'forEach' of undefined错误。我阅读了关于SO的一些类似问题,其中提到插入属性不能立即在链接函数中获得,因此他们建议使用$observe。我甚至在对象上添加了console.log(scope)modules属性。任何想法可能会造成这种情况?

+2

val.forEach()???? –

+0

'scope.modules'是一个数组。即使它不是一个有效的方法,问题是它说我的'scope.modules'属性是未定义的。 – Thiatt

+0

我认为你只对包含插值的属性(我敢肯定总是返回字符串)使用'$ observe',即'{{}}'。所以不要认为这将对阵列起作用。但我可能是错的。我从来没有需要使用它。 –

应该是相当$scope.$watch宁可attrs.$observe$observe在HTML指令&的隔离范围需要@这将是modules="{{module}}",对于大对象DOM会搞的一团糟,所以我宁愿你使用$watch其意义

代码

scope.$watch("modules", function(newVal) { 
    if(newVal){ 
     scope.modules.forEach(function(module) { 
      module.open = false; 
     }); 
    } 
}); 
+1

这将是一个解决方案。问题出在我的父控制器中,在承诺后定义了'$ scope.modules',所以在指令链接时它还没有可用。我可以''观看'财产或取得解决数据,这是我所做的。但是,谢谢;) – Thiatt

+0

@Thiatt更新了答案..如果检查将验证'模块'的价值是否存在,很高兴听到它确实帮助..请付出高分..请问:) –

+0

经过一生的调试,我终于发现承诺的数据导致我的链接函数以未定义的值运行。 – Worthy7