Backbone下划线返回空数组

时间:2014-02-18 17:13:45

标签: javascript backbone.js underscore.js

在前端使用Backbone的Rails应用程序。我有几篇文章保存到数据库中。每篇文章都有自己独特的ID,但它们也有一个publication_id。我想做的是抓住具有特定publication_id的每篇文章。可能有多篇文章与任何给定的publication_id相关联。我正在尝试使用Backbone附带的下划线_.where功能。

  delete_publication: function(id){

    var articles = new MyProject.Collections.Articles();
    console.log(articles.where({publication_id: id}));

  }

编辑:在这个版本中如果我只是console.log文章我得到:

child {length: 0, models: Array[0], _byId: Object, constructor: function, url: "/articles"…}

目标是最终获取模型,从数据库中删除它们然后相应地更新视图。现在我只想要打印具有该特定publication_id的文章子集。这只是将一个空数组打印到控制台。

我也试过这个:

delete_publication: function(id){
  var articles = new MyProject.Collections.Articles();
  articles.fetch({
    success: function(data){
      console.log(  data.where({publication_id: id}) );
    }
  });
}

编辑:在这个版本中如果c​​onsole.log只是我得到的文章:

child {length: 23, models: Array[23], _byId: Object, constructor: function, url: "/articles"…}

也只打印一个空数组。我知道我寻找的数据是在数据库中,所以如果我做了正确的事情,我不应该得到空数组。

如何使用_.where函数来获取集合的子集?也开放更好的方法。希望对于有经验的人来说,答案是显而易见的!

解决方案! *

  delete_publication: function(id){
    var articles = new SimpleGoogleReader.Collections.Articles();
    articles.fetch({
      success: function(data){

        _.each(data.models, function(item){
          if (item.toJSON().publication_id == id) {
            console.log(item.toJSON());
          }
          // console.log(item.toJSON().publication_id);
        });

      }
    });
  }

Rida BENHAMMANE再次做到了!上面的代码只向控制台打印了我想要的文章的JSON对象。

3 个答案:

答案 0 :(得分:0)

var filtered = _.where(data, {
  publicationId: id
});

http://underscorejs.org/#where

答案 1 :(得分:0)

这是使用success回调的第二种方法,只需检查返回的模型是否设置了publication_id

_each(data.models, function(item) {
    if (item.publication_id) {
        console.log(item);
    }
});

答案 2 :(得分:0)

fetch上的成功回调返回jqXHR而不是您正在操作的集合。 你可以像这样重写你的电话并使用你在文章上的闭包。

delete_publication: function(id){
  var articles = new MyProject.Collections.Articles();

  articles.fetch().then(function(){
    console.log(articles.where({publication_id: id}));
  });
}