【问题标题】:Backbone collection fetches all models but sets only oneBackbone 集合获取所有模型但只设置一个
【发布时间】:2014-12-16 03:54:56
【问题描述】:

我知道之前有人问过这个问题,但其他答案并没有解决我的问题:

查看:

initialize: ->
   @dataFields = new app.collections.DataFields([], {campaign_id:@id})
   @loadAndRender()

 loadAndRender: ->
   @dataFields.fetch {
   success: ((model, response) ->
     debugger
     @render()
   ), this
   error: ->
}

系列和型号:

window.app.models.DataField = Backbone.Model.extend(
  initialize: (models, options) ->
    @campaign_id = options.campaign_id
    @id = options.id

  url: ->
    if @id
      '/campaigns/' + @campaign_id + '/data_fields/' + @id
    else
      '/campaigns/' + @campaign_id + '/data_fields'
)

window.app.collections.DataFields = Backbone.Collection.extend(
  model: window.app.models.DataField
  parse : (response, options) ->
    debugger
    response

  initialize: (models, options) ->
    @campaign_id = options.campaign_id

  url: ->
    '/campaigns/' + @campaign_id + '/data_fields'
)

网络日志显示所有“data_fields”都是从远程服务中正确提取的。

第一个块中的第一个调试器语句允许我验证虽然集合中的所有记录都通过网络传输,但只有第一个模型被保存到集合中。

第二个块中的第二个调试器语句允许我验证“响应”对象中确实包含所有模型的 json。从服务返回的数据如下所示:

[{"id":78,"name":"campaign_provider_id","campaign_id":197,"description":"campaign specific identifier","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":true,"display_name":"CampaignProviderID","display_order":1},{"id":79,"name":"campaign_api_key","campaign_id":197,"description":"campaign specific API key","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":true,"display_name":"CampaignAPIKey","display_order":2},{"id":80,"name":"provider_api_key","campaign_id":197,"description":"provider specific API key","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":true,"display_name":"ProviderAPIKey","display_order":3},{"id":81,"name":"email","campaign_id":197,"description":"valid email address of individual","data_type":"email","required_flag":true,"unique_flag":true,"system_flag":null,"display_name":"Email","display_order":4},{"id":82,"name":"first_name","campaign_id":197,"description":"individual's surname","data_type":"string","required_flag":null,"unique_flag":null,"system_flag":null,"display_name":"FirstName","display_order":5},{"id":83,"name":"last_name","campaign_id":197,"description":"individual's family name","data_type":"string","required_flag":null,"unique_flag":null,"system_flag":null,"display_name":"LastName","display_order":6},{"id":84,"name":"company","campaign_id":197,"description":"company or organization that the individual represents","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":null,"display_name":"Company","display_order":7},{"id":85,"name":"country","campaign_id":197,"description":"country where individual or company resides","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":null,"display_name":"Country","display_order":8},{"id":86,"name":"postal_code","campaign_id":197,"description":"zip or postal code where individual or company resides","data_type":"string","required_flag":true,"unique_flag":null,"system_flag":null,"display_name":"ZipCode","display_order":9},{"id":87,"name":"network_size","campaign_id":197,"description":"estimate of the number of individuals in company or organization","data_type":"integer","required_flag":true,"unique_flag":null,"system_flag":null,"display_name":"NetworkSize","display_order":10},{"id":88,"name":"asset_name","campaign_id":197,"description":"name of entity (product, event, service) associated with this lead","data_type":"email","required_flag":true,"unique_flag":null,"system_flag":null,"display_name":"AssetName","display_order":11}]

如果您将数据放入 iso 解析器,您会注意到没有具有相同 ID 值的模型...

为什么我的集合不包含从服务中获取的所有模型?

更新基于'mu is to short'的答案:


根据下面 mu 的回答,我将我的收藏模型更改为:

window.app.models.DataField = Backbone.Model.extend(
  url: ->
      '/campaigns/' + @get('campaign_id') + '/data_fields/' + @get('id')
)

window.app.collections.DataFields = Backbone.Collection.extend(
  model: window.app.models.DataField
  url: ->
    '/campaigns/' + @get('campaign_id') + '/data_fields'
)

当我调用以下命令时:

app.views.DataFields = Backbone.View.extend(
  events:
    'submit #delete-campaign form': 'onSubmitDeleteCampaign'
    'click .data-field-row [name="required_flag"]' : 'onClickRequiredFlag'
    'click .data-field-row [name="unique-radios"]' : 'onClickUniqueFlag'

  initialize: ->
    @dataFields = new app.collections.DataFields(campaign_id:@id)
    @loadAndRender()

  loadAndRender: ->
    @dataFields.fetch {
      success: (model, response) =>
        debugger
        @render()
      , this
      error: ->
    }

现在当我调用@dataFields.fetch 时,它会获取/campaigns/undefined/data_fields。在它实际正确地创建带有活动 ID 的 URL 字符串之前。问题在于,虽然响应正确返回了所有模型,但集合仅设置了列表中的第一个模型。

【问题讨论】:

  • new app.collections.DataFields(campaign_id:@id) 应该做什么?这与集合构造函数的参数不匹配。
  • 这看起来是个错误。现在,当我像这样实例化时,集合会进行正确的服务调用:@dataFields = new app.collections.DataFields([], {campaign_id:@id})
  • 更新的模型和集合很好(jsfiddle.net/mydt17cj)。你能在那个小提琴中重现你的问题吗?

标签: javascript ajax backbone.js coffeescript backbone.js-collections


【解决方案1】:

您模型的initialize 的参数错误。你是说:

initialize: (models, options) ->

但是they're actually:

构造函数/初始化 new Model([attributes], [options])

这意味着你总是说@id = options.id,而这只是说@id = undefined 的一种复杂方式,并且你所有的模型最终都使用相同的@id(恰好是undefined)。

此外,Backbone 会自行处理@id,您不应尝试自行设置。所以你的initialize 应该看起来更像这样:

initialize: (attributes, options) ->
  @campaign_id = attributes.campaign_id

你也可以完全跳过@campaign_id,直接使用@get('campaign_id')(或者@attributes.campaign_id,如果你认为@get太慢,但请不要浪费你的时间进行这种微优化);如果你这样做,那么你根本不需要initialize


当我在这里时,Backbone 的 extend 和 CoffeeScript 的 extends 一起工作,所以你可以说:

class window.app.models.DataField extends Backbone.Model

正确的事情将会发生。

此外,您通常会在 CoffeeScript 中使用 => 而不是 _.bind,因此您可以这样说:

loadAndRender: ->
  @dataFields.fetch(
    success: (model, response) =>
      debugger
      @render()
  )

您当然不必这样做,有时_.bind 即使在 CoffeeScript 中也很有意义。

【讨论】:

  • 但活动 ID 不是未定义的。当我实例化集合时它设置正确......请参阅上面的很多变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
相关资源
最近更新 更多