使用ng重复显示的数据不会传递给函数

时间:2015-03-27 06:13:08

标签: javascript angularjs firebase angularfire

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

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

enter image description here *所有空格都已从对象名称中删除

标记

<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.forEach$firebaseObject.$extend将会从哪里开始,这是正确的吗?


更多信息:

我已经仔细检查了ctrl.data的内容。每个条目都有数据.__。类,所以我不认为问题来自缺少的参数。这是 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)输出undefined。


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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

然后调用您的方法:ng-click="addToBook..."

您也应该在$ scope上设置数据,因此$scope.data = []

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