【问题标题】:Firebase 3 way data binding not working as expectedFirebase 3 路数据绑定未按预期工作
【发布时间】:2014-03-11 00:24:30
【问题描述】:

我有一个 AngularJS 服务,它返回一个 firebase ref。

.factory('sessionManager', ['$firebase','$scope', function($firebase){
    var ref=new Firebase('https://telechat.firebaseio.com/sessions');
    return $firebase(ref);
  }])

在控制器中,我添加了依赖并调用了$bind

$scope.items=sessionManager;
$scope.items.$bind($scope,'sessions').then(function(unbind){
      unbind();
    });

但是当我将它打印到控制台时,除了数据数组之外,返回的数据还有$add$set、.. 等函数的集合。

为什么会这样?我做错了吗?

【问题讨论】:

  • 您似乎正在打印 Firebase 数据引用或快照,而不仅仅是其数据。您是否尝试打印快照的.val()?见firebase.com/docs/reading-data.html
  • 是的,我一开始就是这么想的。但我正在这样做 firebase.com/docs/angular/index.html 。 $scope.sessions 应该有 data 。该对象没有以下方法 .val() 或 .on() ---> 返回错误。
  • 我也面临这个问题。 $scope.items 不仅仅是一个普通的 Javascript 对象,它是一个 Firebase 引用。它违背了 3 路数据绑定的目的。
  • 我希望应该是一个错误。
  • 有趣的是你仍然可以直接修改对象,它会反映变化。例如,您可以执行 $scope.sessions[10] = {username: "admin"} 并添加一个密钥为 10 的新会话。

标签: firebase angularfire


【解决方案1】:

如果我没有正确阅读问题,您可能会认为 $bind() 是将 $firebase 对象转换为原始数据数组或对象。本质上,$firebase 实例和 $bind 之间的唯一区别是数据是本地更改会自动从 Angular 推送回 Firebase。然而,当您使用不带 $bind 的 $firebase 时,您需要调用 $save 来推送本地更改。

请记住,$firebase 是 Firebase API 的包装器,而不是简单的数据数组,在大多数情况下,您仍然可以将其视为原始数据。

要迭代 Firebase 对象中的数据,您可以使用 ngRepeat:

<li ng-repeat="(key, item) in $sessions">{{item|json}}</li>

或者如果你想应用依赖于数组的过滤器:

<li ng-repeat="(key, item) in $sessions | orderByPriority | filter:searchText">

或者在控制器中使用 $getIndex:

angular.forEach($scope.sessions.$getIndex(), function(key) {
    console.log(key, $scope.sessions[key]);
});

提及的 $add/$update/etc 方法是 $firebase object's API 的一部分。 documentationtutorial 应该是理解这个过程的很好的入门书。

这也是 API 的一部分,它将继续发展以更好地匹配 Angular 的做事方式和用户的反馈。

【讨论】:

  • 如果我想将一个元素推送到数组中怎么办?我做不到$scope.sessions.push({username: 'newname'})
  • 别以为这样行得通。必须使用 $scope.sessions.$add({new value})。
  • 较早的 angularfire 允许将 $scope 值复制到另一个变量,并且这个新变量是 3 路绑定的。但是我认为 $firebase 的 3 路数据绑定不允许这样做。
猜你喜欢
  • 2019-04-23
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-08-17
  • 2018-03-09
相关资源
最近更新 更多