【问题标题】:Using ng-init to send data from a ng-repeat to another controller使用 ng-init 将数据从 ng-repeat 发送到另一个控制器
【发布时间】:2017-09-24 15:22:01
【问题描述】:

我有一个运行 ng-repeat 的 html 文件,然后该 ng-repeat 中的每个项目都会生成一个模板,该模板也有自己的控制器

在 html 文件中,我有类似的内容:

<div ng-repeat="item in items">
  <div ng-include="'template.html" ng-init="getData(item)"></div>
</div>

然后这个模板有它自己的控制器。

控制器有函数getData(item),看起来像这样:

$scope.getData = function(item){
 var chapter = item;
}

$scope.myVec = chapter.myVec.length;

template.html 看起来像:

<div ng-controller = "Controller">

<p>{{myVec}}</p>

</div>

然后我在控制台上收到一条错误消息“无法读取未定义的属性'长度'”

我在这里缺少什么?控制器是否在定义var chapter的函数之前运行?

【问题讨论】:

  • 而不是将ng-includeng-init 与内部ng-controller 一起使用,您真的应该考虑将此作为指令。 ng-init 在这里不起作用,因为它绑定到外部控制器,但您需要内部控制器上的数据。
  • 是的,我想我现在明白了。在 ng-init 上运行函数只会获取函数范围内的数据,而不是整个控制器
  • 我写了一个快速指令,做我认为你想要完成的事情;让我知道它是否有帮助(或没有):plnkr.co/edit/aoLzsSmmszeJiVa7znXY?p=preview
  • 是的,我知道你在那里做了什么!谢谢,它有效!我还找到了另一个解决方案。我使用了 $scope.$parent 和父范围内的项目。因为模板的控制器在另一个控制器中,所以解决了这个问题!也感谢您的解决方案!

标签: javascript angularjs angularjs-ng-repeat angularjs-ng-init


【解决方案1】:

我猜这是因为 chapter 是 $scope.getData 函数的局部变量。例如

function foo(num){
   var myNum=num
}
foo(3)
console.log(myNum) // your will get undefinied

改为这样做

var myNum
function foo(num){
   myNum=num
}
foo(3)
console.log(myNum) // your will get 3

【讨论】:

  • 我现在尝试在函数之前声明变量,但仍然未定义。也许在 ng-init 在 html 文件中被调用之前,它有点“运行”整个代码。所以他不知道对象章节中的字段myVec
【解决方案2】:

实际上问题在于 ng-repeat 将项目(这是一个数组元素,原始类型不是对象)发送到函数 getData()。这就是为什么它返回无法读取未定义的属性长度。我希望这可以帮助你。

Var items = [ 'apple',  'mango'] ;
items.length //2
Items[0].length // error

【讨论】:

  • ng-repeat 是在向量中“重复”对象。那么每个对象都有一个向量场,myVec。所以它应该能够得到长度。这绝对是范围问题
  • 您能否用一些模拟数据更新您的 items 数组?以便我们找出实际问题。
  • 我采取了不同的方法。我使用 $scope.$parent 是因为模板控制器位于另一个控制器中,该控制器具有我正在传递的数据。这样我只通过我需要的东西
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 2014-12-24
  • 2015-10-07
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多