【问题标题】:AngularFire / Firebase - GET'ing a single element from $firebaseArray in order to use in DOM / $removeAngularFire / Firebase - 从 $firebaseArray 获取单个元素以便在 DOM / $remove 中使用
【发布时间】:2015-05-13 20:55:46
【问题描述】:

我在使用 AngularFire / Firebase 从集合中获取单个记录时遇到了一些麻烦(然后,在我拥有它之后,将它从集合中删除)。我相信我正在关注位于此处的正确文档:https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray

注意:我发现的许多文档/博客/答案似乎都在使用已弃用的 $firebase 服务(使用 $asArray 方法) - 但是,最近的文档确定 $firebaseArray 是正确使用的服务,仅供参考。

出于某种原因,即使我可以准确地提取民意调查集合,我也无法提取单个元素(尽管官方文档似乎与我使用的语法相同)。

$remove (https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-removerecordorindex) 的文档:

## official docs ##

$remove(recordOrIndex)
Remove a record from Firebase and from the local data. This method returns 
a promise that resolves after the record is deleted at the server. It will 
contain a Firebase reference to the deleted record. It accepts either an 
array index or a reference to an item that exists in the array.

var list = $firebaseArray(ref);
var item = list[2];
list.$remove(item).then(function(ref) {
  ref.key() === item.$id; // true
});

我的代码(见下面的 console.log):

.service('pollsData', function($firebaseArray){
    var fireRef = new Firebase('<-my-firebase-ref-url>');
    var polls = $firebaseArray(fireRef.child('polls'));
    var service = this;

    this.clearPolls = clearPolls;
    this.setInitialPolls = setInitialPolls;
    this.getPolls = getPolls;

    function clearPolls() {
      console.log("length: ", polls.length);  <--- I get a length of 0
      console.log(polls);  <-- I get a $firebaseArray object including the methods in the API docs
      console.log(polls[0], polls[1], polls[2]); <--- all 3 are undefined even though I can see several in the firebase data dashboard

      var poll = polls[1];
      console.log("poll?: ", poll);
      polls.$remove(poll);
    }

    function getPolls() {
      polls = polls || $firebaseArray(fireRef.child('polls'));
      return polls;  <-- I can successfully ng-repeat over this returned selection in the template
    }

    function setInitialPolls() {
      service.clearPolls();
      polls.$add({
        one: {
          name: "fantastic pollllllls",
          selection_one: {
            name: "pizza",
            count: 0
          },
          selection_two: {
            name: "fries",
            count: 0
          }
        },
        two: {
          name: "mediocre poll",
          selection_one: {
            name: "blue",
            count: 0
          },
          selection_two: {
            name: "green",
            count: 0
          }
        }
      });
    }

    setInitialPolls();
});

关于为什么从 $firebaseArray 中提取记录的方括号 [] 符号不能按 AngularFire 文档的预期工作的任何见解?

更新:提供的回复仍然很有帮助,因为这似乎与我对 $firebaseArray 的较新文档以及 API 文档中 $remove 部分给出的示例的理解相冲突。了解这从根本上仍然是一个异步问题,但是由于 $firebase 服务已被弃用并且我正在参考更新的文档,因此觉得这个更新的问题/解决方案是必要的。

【问题讨论】:

  • 在修改了一些之后,它似乎确实是一个异步问题。也就是说,我不完全确定 何时/何地 在 firebase 返回后我能够解决,特别是因为(根据我上面粘贴的文档)文档没有在这里指出异步性质。
  • 查看$loaded()
  • @SinanBolel 在这里是正确的,但原因可能不是很明显。有关详细信息,请参阅重复链接。本质上,您已经向服务器发出了异步数据请求,但随后立即尝试利用所述数据而不等待其加载。
  • 感谢@Kato 的扩展回答

标签: angularjs firebase angularfire


【解决方案1】:

有三种方法可以从$firebaseArray 对象中检索记录。

  1. $getRecord(key)
  2. $keyAt(recordOrIndex)
  3. $indexFor(key)

我会更仔细地查看每个文档的文档,但根据您的描述,您可能希望使用$keyAt。但请记住,$firebaseArray 不是一个严格的数组,可用的方法提供的选项/灵活性比您习惯的“只是一个数组”更多。

此外,如 cmets 中所述,您希望在 Promise 方法内部工作,为您处理三种方式的数据绑定。

var arrayRef = new Firebase(firebase_location).child(child_location);
var theList = $firebase(arrayRef).$asArray();
theList.$loaded(function (list) {
  var x = list.$keyAt(list[target_position]);

  //use other methods for the $firebaseArray object
});

【讨论】:

  • $keyAt() 在这里不是必需的。记录或其$id 可以传递到$remove。这也不是 AngularFire 文档中定义的“三向数据绑定”。这是使用$bindTo 建立的,并且具有不同的行为。这更像是一种从 Firebase 到本地 JavaScript 变量的单向数据绑定。最终,您使用$loaded 的解决方案在这里是正确的答案,但在其余部分在技术上正确之前,我不会对此表示赞同。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 2015-08-20
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
相关资源
最近更新 更多