javascript - 从另一个js函数触发Backbone事件

标签 javascript backbone.js backbone-events

环顾四周,但找不到任何有用的东西,所以..

我有一个带有联系人卡片 View 的 Backbone.js 联系人模型。此 View 有许多输入,您可以在其中编辑联系人信息。

页面上有许多其他表单不是 Backbone 模型,因此它们使用“保存按钮”进行保存。我基本上希望这个保存按钮也触发 Contacts.CardView.saveCard(); (也可能是 FileApp.cardView.saveCard? - 我的一些代码如下。

有什么办法可以做到这一点吗?我以为我可以使用以下内容,但它似乎不会将事件绑定(bind)到 View 之外的任何内容?:

events: {
    "change input": "change",
    "click #save": "saveCard"
},
$('#save').click(function() {
    FileApp.cardView.saveCard;
    _SAVE.save();
})

卡片 View

window.Contacts.CardView = Backbone.View.extend({

    events: {
        "click #save": "saveCard" // doesnt work because #save is outside the view?
    },

    saveCard: function(e) {
        this.model.set({
            name:$('#name').val()
        });
        if (this.model.isNew()) {
            var self = this;
            FileApp.contactList.create(this.model, {
                success:function () {
                    FileApp.navigate('contacts/' + self.model.id, false);
                }
            });
        } else {
            this.model.save();
        }

        return false;
    }
}

路由器:

var FileRouter = Backbone.Router.extend({
    contactCard:function (id) {
        if (this.contactList)  {
            this.cardList = new Contacts.CardCollection();
            var self = this;
            this.cardList.fetch({
                data: {
                    "id":id
                },
                success: function(collection, response) {
                    if (self.cardView) self.cardView.close();
                    self.cardView = new Contacts.CardView({
                        model: collection.models[0]
                    });
                    self.cardView.render();
                }
            });

        } else {
            CONTACT_ID = id;
            this.list();
        }
    }
});

var FileApp = new FileRouter();

最佳答案

一种选择是为此情况创建您自己的事件对象:

// Before initializing views, etc.
var formProxy = {};
_.extend(formProxy, Backbone.Events);

// Add the listener in the initialize for the CardView
window.Contacts.CardView = Backbone.View.extend({
  initialize : function() {
    formProxy.on('save', this.saveCard, this);
  },
  saveCard: function() {
    this.model.set({
        name:$('#name').val()
    });
    if (this.model.isNew()) {
        var self = this;
        FileApp.contactList.create(this.model, {
            success:function () {
                FileApp.navigate('contacts/' + self.model.id, false);
            }
        });
    } else {
        this.model.save();
    }
    return false;
  }
}

// Save
$('#save').click(function() {
   formProxy.trigger('save');
});

参见:http://documentcloud.github.com/backbone/#Events

关于javascript - 从另一个js函数触发Backbone事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377211/

相关文章:

javascript - 如何对齐 2 个不同的图表?

class - 使用 React.js 在选项卡上切换类

javascript - Backbonejs 确定哪个函数将响应从模型返回到 View

backbone.js - Backbone 为所有获取设置全局 api url root

javascript - 如何编写 HTML 页面以在单击按钮时更新从文本文件导入的文本?

javascript - 当我更改文件夹时,jquery 脚本不起作用

javascript - Backbone.js - 集合请求事件未触发

javascript - 销毁事件,或将外部 DOM 项链接到 Backbone 模型

javascript - onChanged 事件未从 iframe 中的输入字段触发

Backbone.js - 正确的模型初始化