【问题标题】:Agility.js + jQueryUI, pass parameters to event handlers in controllerAgility.js + jQueryUI,将参数传递给控制器​​中的事件处理程序
【发布时间】:2013-05-03 01:51:31
【问题描述】:

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

通过支持click、dblclick、mouseenter等常见的DOM事件 jQuery 的事件 API。请查阅 jQuery 的 API 以获取支持的事件列表。

但在文档和我见过的所有其他示例中,绑定到事件的所有控制器函数都没有参数。比如下面的sn-p直接取自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) 的参数来弄清楚它是可拖动的。

有什么方法可以声明我的控制器事件处理程序,以便我可以访问这些参数?或者,还有其他方法可以做我想做的事情吗?除了“它被触发”之外,没有得到关于控制器上事件的任何信息似乎是一个真正的缺点。我什至不确定是否可以扩展 Agility 以便它可以处理标准 DOM 事件以外的事件,尽管从我对代码的阅读中我看不出有任何理由不应该这样做。

Agility 确实为客户端代码提供了一个trigger() 函数来触发事件,该函数允许使用事件类型以外的参数。我想以某种方式将其连接到 jQueryUI 事件,但我不太明白如何。更重要的是,如果控制器看不到它们,为什么你甚至可以将参数传递给trigger()

【问题讨论】:

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


    【解决方案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() 和额外的参数,您会发现那里也没有任何意外。

    【讨论】:

    • 谢谢,这很好用!原来eventui 参数直接传递给Agility 控制器事件处理程序,因此连接jQueryUI 小部件与普通的jQuery 小部件没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2016-12-28
    • 2021-05-30
    • 2011-05-02
    相关资源
    最近更新 更多