将事件绑定到下划线/主干中的动态对象

时间:2012-03-02 10:46:02

标签: javascript jquery backbone.js underscore.js backbone-events

我正在试图弄清楚如何在尚未原型化的对象上侦听自定义事件,或者在underscore.js / backbone.js中不是dom对象。

例如:

//this is inside a view object
play: function(arg)
{
    this.a  = this.image(this.model.a);
    this.a.bind("ready",start,this);//<--- causes error
    this.b  = this.image(this.model.b);
    this.b.bind("ready",start,this);//<--- causes error
    function start()
    {
        // do some stuff in here
    }
    //some more stuff

},
image: function(args)
{
    // load the image, get its data, attach to original model then return it.
    var args    = args;
    var img     = $("<img/>");
    var t       = this;
    img.load(function(){
        t.pasteboard.drawImage(this,0,0);
        args.imageData = t.pasteboard.getImageData(0,0,args.width,args.height);
        args.ready = true;
        args.trigger("ready",args);
    }).attr("src",args.src).hide();
    return args;
},

,模型大致如下:

a:{
    src:"/img/a.jpg",
    width:1320,
    height:639,
    x:0,
    y:0,
    opactiy:0,
    scale:[1,1]
},
b:{
    src:"/img/b.jpg",
    width:1320,
    height:639,
    x:0,
    y:0,
    opactiy:0,
    scale:[1,1]
},

,错误是:

Uncaught TypeError: Object #<Object> has no method 'bind'

当然有理由认为对象没有绑定但是有没有人为此得到了很好的解决方案?

非常感谢 甲

1 个答案:

答案 0 :(得分:4)

如果要绑定到对象,则需要从Backbone.Events对象进行扩展。

假设您创建了一个新对象

var o = {};

你无法绑定它,o.bind()不存在

除非你从backbone.Events扩展。

var o = _.extend({}, Backbone.Events);

o.bind('myCustomEvent', function(){
    alert('triggered!');
});

o.trigger('myCustomEvent');

如果你想开始绑定到数百个对象,我不确定这对性能意味着什么。 所以你应该在使用之前测试一下。

这也是用于在您的应用中创建全局事件聚合器的技术,如Derick Bailey在其帖子中所描述的那样(http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js