Agility.js + jQueryUI,将参数传递给控制器​​中的事件处理程序

时间:2013-05-03 01:51:32

标签: javascript jquery-ui model-view-controller agility.js

Agility.js documentation似乎很清楚Agility对象可以接受任何有效的jQuery事件类型:

  

支持通常的DOM事件,例如click,dblclick,mouseenter等   jQuery的事件API。有关支持的事件列表,请参阅jQuery的API。

但是在文档和我见过的所有其他示例中,绑定到事件的所有控制器函数都不带参数。例如,以下代码段直接取自the online docs

var button = $$({msg:'Click me'}, '<button data-bind="msg"/>', {
  'click &': function() {
    this.model.set({msg:"I've been clicked!"});
  }
});
$$.document.append(button);

这里附加到click事件的lambda显然是无参数的。这适用于普通的jQuery事件,但是为了使用jQueryUI事件,每个事件函数都有关联的数据。例如,如果我想使用DraggableDroppable小部件,则会在Droppable上调用drop()函数来指示已将Draggable拖放到其上,我需要参数drop(event, ui)找出它是哪个Draggable。

有没有办法声明我的控制器事件处理程序,以便我可以访问这些参数?或者,还有其他方法可以做我正在尝试做的事情吗?除了“它被解雇”之外,没有获得关于控制器上的事件的任何信息似乎是一个真正的缺点。我甚至不确定是否可以扩展Agility以便它可以处理除标准DOM之外的事件,尽管从我阅读代码中我看不出任何原因。

Agility确实为客户端代码提供trigger()函数来触发事件,这允许除事件类型之外的参数。我想到了以某种方式连接到jQueryUI事件,但我没有看到如何。更重要的是,如果控制器无法看到参数,为什么甚至可以将参数传递给trigger()

1 个答案:

答案 0 :(得分:1)

这个例子没有显示它是不幸的,但这并不意味着论证不存在。

var button = $$({msg:'Click me'}, '<button data-bind="msg"/>', {
  'click &': function(jqEvent) {
    this.model.set({msg:"I've been clicked!" + jqEvent.target.nodeName});
  }
});
$$.document.append(button);

如果有疑问,只需在您的活动处理程序中加入console.log(arguments)并自行查看。您将获得jQuery为您提供的相同参数。

如果你试验.trigger()和额外的参数,你会发现那里也没有惊喜。