【问题标题】:Unique AngularFire calls in Angular template functionsAngular 模板函数中的独特 AngularFire 调用
【发布时间】:2015-05-27 21:04:32
【问题描述】:

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

举一个人为的例子,假设我正在遍历来自不同作者的书籍列表。该列表将包含特定于书籍的数据(例如标题、出版日期等),但我还希望在列表中显示作者的信息。我不想将作者的信息直接包含在图书数据中,而是简单地引用该作者 ID,并提取他们个人资料中的任何数据,因此如果他们更改姓名,它将反映他们所有图书列表中的更改。

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

我已经研究过如何完成,但尚未找到满足我需要的解决方案。 The answers here 看起来很接近,但它们似乎不再在 Angular >= 1.2.0 中工作,并且它们不考虑必须为每个模板函数调用返回不同的数据。

更新

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

任何帮助都会很棒。

【问题讨论】:

  • 您能粘贴您尝试过的内容吗?或者创建一个 jsFiddle/plunkr 来演示问题?
  • 当然。查看更新后的问题。

标签: angularjs firebase angularfire


【解决方案1】:

您可以使用$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/

【讨论】:

  • 是的。另见 userCache 服务是this fiddle
  • 谢谢你们! @Kato 我看到您的规范化脚本尚未针对 AngularFire 1.x 进行更新,因此我已经完成并进行了必要的更改以使其兼容(据我所见),但返回的是原始帖子列表而不是postData + userData。想法?恐怕我仍然缺少需要为 AngularFire 1.x 更改的内容。
  • userCache 服务只需要将一行代码 $firebase(ref).$asObject() 更改为 $firebaseObject(ref)。
  • @Kato 恐怕这是不正确的,除非我不理解某些东西。进行您在小提琴第 66 行提到的更改仍然会导致一些错误:FirebaseArray.$extendFactory 不是第 13 行的函数(猜想它需要是$firebaseArray.$extend?)和$firebase(ref).$asArray() 需要更改为@987654328 @ 在第 25 行。在这些额外的更改之后(最终是我链接到的小提琴),我没有得到合并的数据。
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2016-05-03
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
相关资源
最近更新 更多