我有以下角度的代码

$scope.prepare = function(){
   $scope.elems = [1,2,3];
};

$scope.action = function(){
   var elem = $scope.elems[0]; //undefined
}


然后,在我看来,我使用指令ng-init =“ prepare()”并将click事件的动作函数附加到按钮上

<button ng-click="action()">action</button>


在动作函数中,作用域是否尚未定义elems数组?

谁能告诉我为什么会这样吗?

谢谢!

最佳答案

由于您没有在调用init()和action()的地方显示控制器或HTML的范围,所以我什至无法猜测为什么自发布代码以来您会遇到问题。这是一个证明了很多的方法:http://plnkr.co/edit/qMzPtJtp9t9CoNKkmWIc?p=preview

<div ng-init="prepare()"></div>
<input type="button" value="Call function" data-ng-click="action()" />
<p>Init Defined: {{elems}}</p>
<p>Function call: {{redefined}}</p>


$scope.prepare = function(){
   $scope.elems = [1,2,3];
  };

  $scope.action = function(){
   $scope.redefined = $scope.elems[0]; //undefined
  }


这么说,您没有正确使用ng-init()。从Angluar文档中:

“此指令可能会被滥用,以在模板中添加不必要的逻辑。只有少数ngInit适当的用法,例如为ngRepeat的特殊属性设置别名...以及通过服务器端脚本注入数据。除此之外,这几种情况,则应使用控制器而不是ngInit来初始化作用域上的值。”

链接至ng-init文档:https://docs.angularjs.org/api/ng/directive/ngInit

您最好在控制器中初始化数组。

09-25 18:55