model.fetch成功回调不会在firefox上触发,但适用于chrome

时间:2011-07-26 20:48:55

标签: backbone.js coffeescript

我有一个成功回调模型提取,并且一切正常在chrome上工作,但在firefox上事件不会触发。根据控制台,请求已完成。

代码示例:

父类功能:

DownloadUserPromotions: (callback) ->
    self = @
    @model = new app.models.client({ id: JSON.parse($.cookie('jsondata')).id })

    lm = ->
      console.log "4"
      window.USER = self.model
      if typeof callback == 'function' then callback.call()   

    @model.fetch
      success: lm
      data: 
        relationships: 'client_promotions'
    console.log "3"

查看功能:

render: ->      
    self = @
    self.ReadUserInfo()
    console.log "1"
    renderTemplate = ->
      console.log "5"
      #Below Issue is wierd.......#TODO
      @USER = JSON.parse(JSON.stringify(@USER))
      $(self.el).html clientsPromotionsTemplate
        promos: USER.client_promotions
      $('.spinner#load').hide()
      self.FadeIn()

    $('.spinner#load').show()
    console.log "2"
    @DownloadUserPromotions renderTemplate  
    @

旁注:标记的TODO是另一个问题。 Bonus感谢您帮助我弄清楚为什么JSON只能以那种错综复杂的方式运作。

2 个答案:

答案 0 :(得分:2)

首先,您需要了解=>之间的区别。和 - >用于在coffeescript中定义函数。

=>将函数内的 this 绑定到函数定义的

- >将函数内的 this 绑定到函数

self = this  

是coffeescript中的代码气味标志,当您尝试捕获以解决问题=>时,您无法正确理解如何正确使用上述内容。解决了。

你重写的渲染函数可能是

render: ->
    @ReadUserInfo()
    console.log "1"
    renderTemplate = =>
      console.log "5"
      #Below Issue is wierd.......#TODO
      @USER = JSON.parse(JSON.stringify(@USER))
      $(@.el).html clientsPromotionsTemplate
        promos: USER.client_promotions
      $('.spinner#load').hide()
      @.FadeIn()

    $('.spinner#load').show()
    console.log "2"
    @DownloadUserPromotions renderTemplate
    @

可能会解决你的一些奇怪问题。以前我很确定 你有这条线

    @USER = JSON.parse(JSON.stringify(@USER))

永远不会按预期工作,因为@USER会扩展到this.USER和 无论这个可能是什么时候调用回调可能是相当随机的 在您的框架和浏览器上。

答案 1 :(得分:2)

由于我的成功回调是JSON对象的一部分,因此firefox无法找到它正在查找的默认值,因此没有触发任何内容。指定dataType:'json'在获取时解决了这个问题,因为firefox知道在哪里寻找成功回调。

Chrome显然是在想我......