【问题标题】:AngularFire: What is the best practice to test if $firebaseObject has no keys?AngularFire:测试 $firebaseObject 是否没有键的最佳实践是什么?
【发布时间】:2015-09-28 15:24:06
【问题描述】:

angular.equals({}, myObj) === true 时,简单的 JavaScript 对象为空(= 没有键)。

是否有一些实用功能可以检测$firebaseObject 是否没有键?它永远不会等于{},因为它看起来像这样:

{
   $$conf: Object,
   $id: "objectId",
   $priority: null,
   $value: null
}

编辑:当$firebaseObject 没有数据时,我试图隐藏<div>。似乎这样做可以解决问题,但我不知道这是否是正确的解决方案:

<div ng-hide="myObj.$value === null">

[...]

</div>

来自the doc

如果数据库中的值是原始值(布尔值、字符串或 number) 则该值将存储在此 $value 键下。修改 这个值然后调用$save() 也会更新服务器的 价值。

请注意,只要存在其他键,就会忽略此键。到 将对象更改为原始值,删除其他键并添加 对象的这个键。

[...]

我的$firebaseObject 有这样的孩子:

key: {
   value1: 'something',
   value2: 'something'
}

当我玩 $value 时,我发现了这个:

  • $firebaseObject没有孩子时,$valuenull
  • $firebaseObject有一个孩子时,$value是它的关键
  • $firebaseObject 有多个子对象时,$value 包含所有子对象

问题是,我可以使用$value 这种方式来解决我的问题还是因为...不可能?

【问题讨论】:

  • 听起来像是 XY 问题 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。您能分享一下您想要完成的工作以及您尝试过的代码吗?
  • 对我来说似乎是正确的解决方案。虽然我会选择 ng-show="myObj"
  • @Frank van Puffelen ng-show="myObj" 对我不起作用。请您更详细地解释一下(也许写一个答案)?
  • @Frank van Puffelen here 是问题的证明。

标签: angularjs firebase angularfire


【解决方案1】:

因为这是您在控制器中绑定数据的方式:

function MainController($firebaseObject) {
  var ref = new Firebase('https://yours.firebaseio.com');
  vm.users = $firebaseObject(ref.child('users'));

这适用于显示/隐藏:

<div class="small-12 column" ng-show="vm.users">
  <h1>No user</h1>
</div>
<div class="small-12 column" ng-show="!vm.users">
  <h1>Users</h1>
  <ul>
    <li ng-repeat="user in vm.users">{{user}}</li>
  </ul>  
</div>

顺便说一句:由于您使用 ng-repeat 而不是用户,因此您需要将其设为 $firebaseArray()

【讨论】:

  • 哦,如果vm.users 没有数据,ng-show="vm.users" 会显示div?为什么?我会假设相反的行为。顺便说一句,它与$firebaseObject 配合得很好——为什么$firebaseArray 更好?
  • 我没有深挖,只是更新到我这里做的:trenches.firebaseapp.com
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2019-03-16
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多