Bakbone模型扩展了过滤json

时间:2016-01-12 12:44:53

标签: javascript json backbone.js

我是骨干js的新手。

我正在尝试过滤骨干js模型中的一些特定键和值,这里的代码扩展如下。

 var items = ["open","close"];
 var ReportModel = Backbone.Model.extend({
    url: function() {
      return tab+".json";
    }
 });

其中tabe是动态json文件名。在我的json文件中有很多键值对,但我只想加载项目列表中提到的那些键。 我看到一些使用parse函数的地方,但是a;所以没有用。请让我知道如何使用主干过滤json的特定键。 我也试过从json创建一个dict并将它传递给类似的模型。

     var ReportModel = Backbone.Model.extend({
     "open":{.......}
      });

但我遇到了问题。

  

抛出新错误(' A" url"必须指定属性或功能');

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

您缺少一些成功完成任务的步骤。

首先注意错误:Backbone在传递函数时需要url属性上的字符串。如果您想使用函数返回您的网址,请使用urlRoot

现在进入真正的编码: 既然你谈到了一个具有多个键值的json文件,也许你应该将你的模型声明为一个键值对象,然后创建一个Backbone.Collection来包装你的模型。 Backbone.Collection公开了许多可以帮助我们对结果建模的实用程序,在这种情况下,通过使用我们集合的where()函数,您可以在从远程文件中检索后过滤数据

如果您需要对该功能进行更多控制,可以选择过滤您的收藏,您可以随时调用非关键字函数filter()

请参阅underscorebackbone的官方文档,因为您会发现许多可以帮助您的功能,而且大多数功能都有一个示例,说明如何使用它们。

现在我们已经拥有了所有东西,让我们创建一个Backbone.Collection来包装已定义的模型:

var ReportCollection = Backbone.Collection.extend({
   model: ReportModel,
   urlRoot: function(){
      return  'yoururl.json';
   }
});

现在,如果要过滤结果,只需获取集合并对其执行过滤:

var myReports = new ReportCollection();
//call the fetch method to retrieve the information from remote
myReports.fetch({success: function(){
   //the collection has been fetched correctly, call the native where function with the key to be used as a filter.
   var filteredElements = myReports.where({my_filter_key : my_filter_value});

});

在您的filteredElements中,您将拥有一个对象数组,该对象数组由与传递给where函数的键/值匹配的所有模型组成。 如果你需要一个新的Collection,你只需要将结果作为参数传递:var filteredCollection = new ReportCollection(filteredElements);

答案 1 :(得分:0)

您可以在解析方法中使用_.pick(),如下所示:

var items = ["open", "close"];
var ReportModel = Backbone.Model.extend({
  url: function() {
    return tab + ".json";
  },
  parse: function(response) {
    return _.pick(response, items);
  }
});