Backbone + JQuery插件不起作用(用CoffeeScript编写)

时间:2012-08-21 15:26:34

标签: jquery jquery-mobile backbone.js coffeescript

好的,我有一个简单的JQuery插件,当应用于div时,将使用预加载器图像整齐地加载该div中的所有图像。这很好。

然而,在Backbone中,我在页面加载后将数据从JSON附加到元素。因此,下面的代码将无效。

$(document).ready( ->
    $("#theList").preloader()
)

所以我需要在生成列表之后将“$(”#theList“)。preloader()”放在我的渲染函数中..

class HomeView extends Backbone.View
constructor: ->
    super

initialize: ->
    @isLoading = false

events: {
     "click #nextPage": "nextPage"
     "click #prevPage": "prevPage"  
}


template: _.template($('#home').html())
theListTemplate: _.template($('#theList').html())

render: ->
    $(@el).append(@template)
    @loadResults()
    $("#theList").preloader() #<----------------- DOESN'T WORK NOW


loadResults: () ->
    @isLoading = true

    Properties.fetch({
        success: (data) =>

            #Append properties to list
            $('#theList').append(@theListTemplate({data: data.models, _:_})).listview('refresh')


        error: ->
            @isLoading = false
            alert('Unable to load information')
    })

但是,现在代码行在Backbone View / Model / Controller或其他内容中,它不起作用..

作为参考我加载我的应用程序就像这样..

$(document).ready( ->
    console.log('document ready')
    app.AppRouter = new AppRouter()
    Backbone.history.start()
)

任何帮助将不胜感激!感谢。

1 个答案:

答案 0 :(得分:2)

假设预加载器不打算在loadResults#fetch#success中添加的节点上运行(因为在调用预加载器时没有返回提取),我怀疑问题是,在执行期间render()函数,视图el尚未成为DOM的一部分。

如果您调用HomeView

myHomeView = new HomeView()
$('some selector').append(myHomeView.render().el)

HomeView的el还没有被添加到DOM中,它在一个独立的文档中。

因此,jQuery选择器$("#theList")返回一个空结果 - 因为它搜索DOM。这可以通过console.log'n选择结果,或者使用调试器设置断点,并使用控制台进行测试来轻松验证。

谢天谢地,修复很简单。您需要通过使用jQuery reference scoped to the view将选择器作用于视图来引用分离的文档:

@$("#theList").preloader()

或者,自己动手

$(@el).find("#theList").preloader()