【问题标题】:interpreting backbone collection data that it received from an api controller解释从 api 控制器接收到的主干收集数据
【发布时间】:2015-09-11 15:20:50
【问题描述】:

我正在尝试使用一个简单的集合和视图将我的骨干集合中的数据写入我的网站。我只想遍历集合并在我的模板中显示 Id、Name 等属性。

我的集合从 api 控制器获取数据(数据示例如下所示)。

我有限的知识让我猜测 api 控制器正在返回一个对象而不是 JSON。

所以我猜这弄乱了我的结果。我已将集合写到我的 Chrome 控制台,并附上了我在下面看到的屏幕截图。

那么看看下面的代码,有没有办法可以格式化从 api 返回的数据,以便我的集合可以有效地使用它?

代码如下:

   var ResearchCollection = Backbone.Collection.extend({
       url: '/api/lab',

       getresearch: function() {
           this.fetch({
               url: this.url
           });
       }
   });

var researchCollection = new ResearchCollection();

return Backbone.View.extend({
    className: 'labRender',
    template: _.template(tmpl, null, { variable: 'x' }),

 render: function () {
        researchCollection.getresearch();
        console.log('collection: ', researchCollection);
     }

基本上,我只想遍历我的集合并在模板中显示 Id、Name 等属性。

这是来自我用来填充我的集合的 api 控制器的原始数据:

{
  "odata.metadata":"http://sol.edu/SOM/Api/v1/$metadata#ApiKeys","value":[
    {
      "odata.id":"http://sol.edu/SOM/Api/v1/ApiKeys('2f2627ed-3a97-43aa-ac77-92f227888835')","Id":"2f2627ed-3a97-43aa-ac77-92f227888835","Name":"VideoSearch","TimeoutInMinutes":20160,"IsDefault":false,"CreateAuthTicketsForResources":false,"ReportAuthFailureAsError":false,"ExcludePrivatePresentations":true,"Internal":true,"ViewOnlyAccessContext":true
    }
  ]
}

当管道传输到浏览器的控制台时(为什么每个字符都是一个单独的属性?):

【问题讨论】:

  • 将字符串设置为集合时会发生这种情况。 new Backbone.Collection("someString") 准确返回您的屏幕截图中的内容。将方法“parse”添加到集合并通过调试器检查它的 args(它在 fetch 之后被调用)。响应可能是字符串。
  • 解析什么?谢谢
  • 它会将响应传递给“parse”方法。 backbonejs.org/#Collection-parse。默认情况下它是空函数(无操作)。但是,一旦您在集合中定义它,您就可以在设置为集合之前格式化来自服务器的响应。解析:函数(响应){返回响应; // 检查您的响应以查看它是否不是字符串。如果它是字符串,你可以解析它 JSON.parse(response) 或在服务器端更改返回格式。
  • 试试console.log(r),应该是字符串。如果是,请修改您的解析方式: parse: function(r) {return JSON.parse(r) }
  • 应该的,因为getresearch调用fetch,fetch会调用parse。

标签: javascript json backbone.js backbone-views backbone.js-collections


【解决方案1】:

我想这可能是因为你混淆了集合和模型。在 Backbone 中,Model 是基本单元,Model 可用于渲染模板。但是,Collection 是“模型”的有序集。因此,如果您只想像上面描述的那样转换数据,您最好选择Model 而不是“集合”。试试这个:

var ResearchModel = Backbone.Model.extend({

       initialize: function(attributes) {
           this.url = 'api/lab'
       }
   });

// when you initialize a Model or collection, the first parameter is the attribute you want to initialize
var researchModel = new ResearchModel({});

return Backbone.View.extend({
    className: 'labRender',
    template: _.template(tmpl, null, { variable: 'x' }),

 render: function () {
        researchModel.fetch();
        console.log('collection: ', researchModel);
     }

否则,如果你只是想使用collection,你最好指定它的Model.Backbone 使用JSON,这样你也可以用你的key指定模型。

【讨论】:

  • 那么 url,/api/lab,返回一个完整的集合,而不仅仅是一个模型
  • 在这种情况下,一方面,你可以改变你从服务器返回的数据,使其符合模型和集合的格式。另一方面,你可以使用 underscore.js 来解析您代码中的集合。请看这里,可能对您有所帮助:underscorejs.org
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2014-03-19
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多