【问题标题】:Backbone events not firing as expected骨干事件未按预期触发
【发布时间】:2013-08-12 15:34:44
【问题描述】:

我初始化视图:

notifications = new tvr.notifications.Collection
notifications.fetch()
new tvr.notifications.View collection:notifications

我正在向主干集合添加“通知”:

notifications =  new tvr.notifications.Collection
notifications.fetch()
notifications.create html:this_notification

notifications.coffee

    class Notifiction extends Backbone.Model
    class Notifictions extends Backbone.Collection
        model = Notifiction
        localStorage: new Backbone.LocalStorage 'tvr.notifications'


    class NotificationView extends Backbone.View
        initialize: ->
            @listenTo @collection, "add", @update

        update: ->
            alert "update"

    namespace 'tvr.notifications', (exports) ->
        exports.Model = Notifiction
        exports.Collection = Notifictions
        exports.View = NotificationView

这个事件永远不会被调用,我可以看到集合中创建的对象。

我只想知道何时添加新的,或从集合中删除,所以我可以更新 HTML 中的徽章编号。

【问题讨论】:

    标签: jquery backbone.js coffeescript backbone-events


    【解决方案1】:

    您正在尝试将"Add" 事件绑定到函数调用,这是不可能的。您需要将事件绑定到函数引用,Backbone 的事件机制将代表您调用被引用的函数。在不使用alert 的情况下,这是一个差异示例(在 JavaScript 中)。

    要调用的函数

    var myFunc = function() {
        alert("happy days");
    }
    

    非法

    notifications.on("add", myFunc());
    

    法律

    notifications.on("add", myFunc);
    

    因此,您可以在示例中看到您尝试调用alert 函数并在使用on 绑定它时传递"happy days" 的参数。这是不允许的。

    但是,如果您编写一个无参数函数来包装您想要调用的代码,例如上面的 myFunc 示例,并将其分配给变量或其他对象,您可以将事件绑定到函数的引用。然后,这应该按照您期望的方式运行。

    最后,您应该使用listenTo 绑定事件,而不是on。这是因为已经在 SO 上讨论过的原因。如需进一步参考,请阅读以下内容:

    Difference between ListenTo and on

    Backbone js .listenTo vs .on

    【讨论】:

    • 我按照你的解释做了,但这不起作用。我更新了我的问题
    • 您可能需要_.bindAll(this) 作为initialize 函数的第一行。此外,我看不到您将模型添加到 Notifictions 集合的任何证据。在您的示例中,您甚至没有引用它,因为您在 listenTo 函数中 new 它。那么如何向其中添加模型呢?
    • 它在问题的第 1 行和第 2 行。我试试 bindAll
    • 我想我知道出了什么问题,View 正在监听集合事件,而您永远不会通过您调用 create 的集合的视图。您需要将 notifications 集合作为参数 opon 初始化传递给视图。 之前你在集合上调用create. Also, change @listenTo new Notifictions,“添加”,@upate` 到@listenTo @collection, "add", @upate(或类似的,我的咖啡脚本不是最好的:)
    • bindAll 不起作用,这家伙也有同样的问题stackoverflow.com/questions/9627598/…
    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多