2011-03-17 78 views
1

这似乎可以作为http://www.knockoutjs.com的家伙似乎这样做。我还没有能够使他们的代码库有足够的感觉来获得类似的模式。如何将事件听者附加到一个对象JS

切实我有一个基于jQuery的选项卡上的UI一个MVVM风格的应用程序。每个选项卡都由一个视图模型表示,我希望能够根据模型中的更改验证并触发事件。

我创建一个类似的页面加载以下我的数据的表示:


$(document).ready(function(){ 
    thisTab = new ThisTab(); 
}); 

function ThisTab(){ 
    Load: {Load from my model} 
    Save: {Save/Persist model to the db (via web service call)} 
    Validate: { 
    this.Item1 = function(){Validate item 1, do work, refresh fields, whatever.} 
    } 
} 

模型本身是一个复杂的全球性目标,并转移到DOM(输入等)即时更新的对象。对其中一些属性的更改应调用其关联的验证项​​目thisTab.Validate.Item1。我没有提出修改事件的问题。如果我将该事件监听器绑定到一个随机DOM元素,我可以调用我的例程而不会出现问题,并且一切都很好。但是,将事件附加到非相关的DOM对象看起来很奇怪。

所以问题是:我该怎么做类似thisTab.addEventListner("someEvent")$(thisTab).bind("someEvent"),其中thisTab不是DOM元素,而是本地对象。试图做到这一点,我总是会得到一个错误,“这种方法不被支持”。

回答

1

将事件附加到标准对象不使用相同的方法;基本上,你会实现自己的三项赛,像这样:

function ThisTab() 
{ 
    listeners: [], 
    addListener: function(callback) { this.listeners.push(callback); }, 
    load: { // Finds DOM elements and such, and attaches to their events. The callback from the DOM event should be a method on your object }, 
    yourDomEventCallback: function() 
    { 
     for(var j = 0; j < this.listeners.length; j++) 
      this.listeners[j](); 
    } 
} 

上面的代码应该作为一个起点,因为我只是拼凑一起,有可能语法错误。基本上,你已经把你的对象和映射到你想捕获的事件上,然后公开方法来附加你将在隐藏的DOM事件发生时调用的回调方法。你不能使用jQuery的DOM事件抽象,因为这些事件对你的自定义对象没有意义。

1

绑定事件到你的正常JS对象,你会为一个DOM对象做。

$(thisTab).bind("someEvent", function() { 
    // handler's code here 
}); 

看到这个example。使用这个有一个副作用,即jQuery将添加一个看家标识符作为对象上的属性 - 它看起来就像 jQuery1510587397349299863。此属性命名jQuery<timestamp>被添加到具有事件或与它们相关的数据,并定期对象的所有DOM对象

行为类似。如果你对被修改的模型对象感到不舒服,那么使用你自己的回调机制,这应该很容易添加。

+0

由于该事件在DOM中不确实的泡沫就只能捕捉触发本身的事件。我需要它来监听另一个对象(或潜在的DOM)的变化。今天的某个时候,我会试着准备一个小提琴。 – iivel 2011-03-17 13:35:36