我有一个名为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);}
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。
答案 0 :(得分:0)
似乎data
没有必需的参数 - 所以data.classes
等未定义。然而,对象data
本身是定义的;如果它不是,则会在之前抛出错误。尝试仔细检查你正在迭代的内容(即ctrl.data
),以及迭代的对象是否实际上具有您正在寻找的参数。
答案 1 :(得分:0)
没有看到你的控制器代码(假设它被命名为'ctrl'?),我不能肯定地说,但我认为你正在寻找
$scope.addToBook = function (...) {
...
};
然后调用您的方法:ng-click="addToBook..."
您也应该在$ scope上设置数据,因此$scope.data = []
然后它会在标记中被引用为data
,而不是ctrl.data
。