Angular模板函数

时间:2015-05-27 21:04:32

标签: angularjs firebase angularfire

我正在使用AngularFire并且有一个ng-repeat列表,其中的项目包含特定于该项目“作者”的数据(多个用户可以添加到列表中),例如名称,位置等。我没有将这些数据写入由ng-repeat迭代的数组中,因为它可能在将来发生变化。相反,特定于作者的数据存储在不同的位置,因此目标是如果作者更改其信息,则所有数据都会反映在列表中。

对于一个人为的例子,想象一下我正在迭代来自不同作者的书籍清单。该列表将包含特定于书籍的数据(例如标题,发布日期等),但我还想在列表中显示作者的信息。我不想直接在书籍数据中包含作者的信息,而是简单地引用该作者ID,并提取他们的个人资料中的任何数据,这样如果他们更改了他们的名字,它将反映他们所有书籍列表中的变化。

这意味着我只能通过模板函数(例如{{getAuthorName(authorId)}})对Firebase进行异步调用以检索每个列表项的信息。唯一的问题是它们是异步调用,模板函数在数据可用之前进行评估。

我已经研究过如何完成但尚未找到适合我需要的解决方案。 The answers here似乎很接近,但它们似乎不再适用于Angular> = 1.2.0,并且它们不会考虑为每个模板函数调用返回不同的数据。

更新

这是我现在拥有的JSFiddle。我已经取得了一些进展,但现在返回的所有内容都是预期的promise对象。我不确定如何在这种情况下实现.then以获得实际值。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

您可以使用$firebaseObject然后将其存储在对象中,以确保它不会再被击中。像这样:

var authors = {};

$scope.getAuthorName = function(authorId){
    if(!authors[authorId]){
        var authorRef = new Firebase(fburl + "/authors/" + authorId);            
         authors[authorId] = $firebaseObject(authorRef);
    }
    return authors[authorId];
};

你可以在这里看到工作小提琴:http://jsfiddle.net/0rcdpq47/