我知道这个问题之前已经被问过,但其他答案没有解决我的问题:
查看:
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”均已从远程服务中正确提取。
第一个 block 中的第一个调试器语句允许我验证虽然集合中的所有记录都是通过网络完成的,但只有第一个模型被保存到集合中。
第二个 block 中的第二个调试器语句允许我验证“响应”对象中是否确实包含所有模型的 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}]
如果将数据放入 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 时,它会获取/campaigns/undefined/data_fields。在它实际正确创建带有营销事件 ID 的 URL 字符串之前。问题在于,虽然响应正确返回了所有模型,但集合仅设置了列表中的第一个模型。
最佳答案
模型初始化
的参数是错误的。你是说:
initialize: (models, options) ->
但是they're actually :
constructor / initialize
new Model([attributes], [options])
这意味着您总是说@id = options.id
,而这只是@id = undefined
的复杂表达方式,并且您的所有模型最终都会得到相同的@id
(恰好是未定义
)。
此外,Backbone 将自行处理 @id
,您不应尝试自行设置。所以你的初始化
应该看起来更像这样:
initialize: (attributes, options) ->
@campaign_id = attributes.campaign_id
您也可以完全跳过 @campaign_id
并仅使用 @get('campaign_id')
(或 @attributes.campaign_id
如果您认为@get
太慢了,但请不要在这种微优化上浪费时间);如果您这样做,那么您根本不需要初始化
。
当我在这里时,Backbone 的 extend
和 CoffeeScript 的 extends
协同工作,因此您可以说:
class window.app.models.DataField extends Backbone.Model
正确的事情将会发生。
此外,您通常会在 CoffeeScript 中使用 =>
而不是 _.bind
,因此您会这样说:
loadAndRender: ->
@dataFields.fetch(
success: (model, response) =>
debugger
@render()
)
当然,您不必这样做,有时 _.bind
即使在 CoffeeScript 中也有意义。
关于javascript - Backbone 集合获取所有模型,但仅设置一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26477978/