【问题标题】:Data displayed with ngrepeat not passing to function使用 ngrepeat 显示的数据未传递给函数
【发布时间】:2015-05-31 09:50:58
【问题描述】:

我有一个名为 ctrl.data 的 AngularFire 对象 ($firebaseObject()),ng-repeat 会显示该对象。在 ng-repeat 生成的标记中,我有一个按钮,单击该按钮会运行一个功能。我想将 ng-repeat 用于填写标记的项目中的信息传递给函数。

我在 Firebase 上的数据结构如下*:

*所有空格都已从对象名称中删除

标记

<div ng-repeat="data in ctrl.data track by $index">
    {{data.name}}, {{data.lvl}} ...
    <input type="button" ng-click="ctrl.addToBook(data.classes, data.comp, data.csttime, ...)" value="Add!">
</div>

功能

ctrl.addToBook = function (classes, comp, csttime, ...) {
      ctrl.book.push({
        classes: classes, comp: comp, csttime: csttime ...
      });

当函数运行时,它正在推送:

{classes: undefined, comp: undefined, csttime: undefined...}

我也试过

  • 替换传递参数data 并推送整个对象 但我被告知我正在推动的是未定义的。例子: ng-click="addToBook(data)"function(toBePassed) {data.book.push(toBePassed);}
  • 在每个参数周围加上 {{ }}, Angular 不想渲染。错误:[$parse:syntax] http://errors.angularjs.org/1.3.15/$parse/syntax?... 稍后 对按钮的引用。按照链接给出:Error: $parse:syntax / Syntax Error: Syntax Error: Token '' {1} at column {2} of the expression [{3}] starting at [{4}]. 我不知道 如何解释。

我需要做什么才能将信息传递给函数,或者让函数知道要推送什么?

被 ng-repeat 迭代的每个对象都有一个与对象名称匹配的 name 属性,因此可以删除对象的名称,我可以使用数组而不是对象。将数据重组为数组是否会使这更容易,因为我可以引用一个 Id?如果是这样,我相信我会遇到与this 类似的情况,但更愿意避免使用 ID。

另一种选择是为每个对象提供一个推送所需数据的方法。这会是更好的方法吗?我仍然对 angular 感觉很陌生,但我认为 angular.forEach$firebaseObject.$extend 将是从哪里开始,对吗?


更多信息:

我已经仔细检查了 ctrl.data 的内容。每个条目都有 data.__.classes,所以我认为问题不在于缺少参数。这是 console.log(ctrl.data) 的输出。

$$conf: Object
$id: null
$priority: null
AnimalFriendship: Object
    classes: "Bard, Cleric (Nature), Druid, Ranger"
    comp: "V, S, M (a morsel of food)"
    csttime: "1 action"
    desc: "-Long description-"
    duration: "24 hours"
    lvl: 1
    name: "Animal Friendship"
    range: "30 feet"
    ritual: false
    school: "Enchantment"
    __proto__: Object
-Many more objects which have the same properties as above-
__proto__: Object
    $$error: ...
    $$notify: ...
    $bindTo: ...
    $destroy: ...
    $loaded: ...
    $ref: ...
    $remove: ...
    $save: ...
    $watch: ...
    forEach: ...
    __proto__: Object

但是 console.log(ctrl.data.AnimalFriendship) 输出未定义。


tldr; 我无法访问 ng-repeat 正在访问的对象,因此无法将每次迭代处理的信息传递给函数。从 AngularFire 对象更改为 AngularFire 数组可能需要作为答案,并仔细规划以避免possible $index problems

【问题讨论】:

  • 如果这仍然是一个问题,提出一个 plunkr 显示问题,我会看看它

标签: javascript angularjs firebase angularfire


【解决方案1】:

没有看到你的控制器代码(假设它被命名为'ctrl'?),我不能肯定地说,但我认为你正在寻找

$scope.addToBook = function (...) {
    ...
};

然后像这样调用你的方法:ng-click="addToBook..."

你也应该在 $scope 上设置你的数据,所以$scope.data = []

然后它将在标记中仅引用为data,而不是ctrl.data

【讨论】:

  • 我一直在使用__ = this; 方法。在这种情况下ctrl = this; 我的函数是ctrl.addToBook = function (arguments) {ctrl.book.push({property: argument ... }); ng-click 放置在一个按钮上,该按钮在每次迭代 ng-repeat 时出现。我的目标是传递 ng-repeat 正在创建的信息,例如。 {{data.lvl}} 将作为参数 data.lvl 传递。我对继续添加更多代码犹豫不决,但是否有任何代码应该添加到问题中?
【解决方案2】:

似乎data 没有所需的参数 - 所以data.classes 等未定义。对象data 本身已定义;如果不是,则会更早地抛出错误。尝试仔细检查您正在迭代的内容(即ctrl.data)以及迭代的对象是否确实具有您正在寻找的参数。

【讨论】:

  • 我已经添加了console.log(ctrl.data)的内容但是不能访问ctrl.data的children,比如ctrl.data.AnimalFriendship。我正在寻找的参数存在于 Firebase 上,我可以看到它们,但似乎无法访问它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多