Javascript 主干集合获取所有模型,但仅设置一个

Javascript 主干集合获取所有模型,但仅设置一个,javascript,ajax,backbone.js,coffeescript,backbone.js-collections,Javascript,Ajax,Backbone.js,Coffeescript,Backbone.js Collections,我知道以前有人问过这个问题,但其他答案并没有解决我的问题: 视图: 收集和模型: window.app.models.DataField = Backbone.Model.extend( initialize: (models, options) -> @campaign_id = options.campaign_id @id = options.id url: -> if @id '/campaigns/' + @campaign_i

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

视图:

收集和模型:

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'
)
网络日志显示所有的“数据字段”都正确地从远程服务中提取

第一个块中的第一个调试器语句使我能够验证,尽管集合中的所有记录都是通过连接完成的,但只有第一个模型保存到集合中

第二个块中的第二条调试器语句允许我验证“response”对象中是否包含所有模型的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}]
initialize: (attributes, options) ->
  @campaign_id = attributes.campaign_id
如果将数据放入ison解析器,您将注意到没有具有相同ID值的模型

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

根据“mu是简写的”更新答案:


根据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时,它会获取/campetings/undefined/data\u字段。在它实际使用活动ID正确创建URL字符串之前。问题是,当响应正确返回所有模型时,集合仅设置列表中的第一个模型。

模型的
初始化的参数错误。你是说:

initialize: (models, options) ->
但是:

构造函数/初始化
新模型([属性],[选项])

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

此外,主干网将自行处理
@id
,您不应该自己设置。因此,您的
初始化
应该更像这样:

[{"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}]
initialize: (attributes, options) ->
  @campaign_id = attributes.campaign_id
您也可以完全跳过
@campaign\u id
,只需使用
@get('campaign\u id')
(或
@attributes.campaign\u id
,如果您认为
@get
太慢,请不要将时间浪费在这种微优化上);如果执行此操作,则根本不需要
初始化


我在这里的时候,主干网的
extend
和咖啡脚本的
extends
一起工作,所以你可以说:

class window.app.models.DataField extends Backbone.Model
正确的事情会发生

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

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

当然,您不必这样做,有时甚至在CoffeeScript中,
绑定也有意义。

但是活动ID不是未定义的。当我实例化集合时,它设置正确。。。请查看上面的许多更改。
新的app.collections.DataFields(campaign\u id:@id)
应该做什么?这与集合构造函数的参数不匹配。这似乎是个错误。现在,当我像这样实例化时,集合发出了正确的服务调用:
@dataFields=new app.collections.dataFields([],{campaign\u id:@id})
更新的模型和集合都很好()。你能用那把小提琴再现你的问题吗?