我怎样才能实现这个目标?
$(window).bind('done', function (e) {
e.result = "my data";
});
var state = $(window).trigger('done');
equal("my data", state);
目前.trigger
返回JQuery对象。
更新
事件是从另一个模块触发的,所以我不能使用闭包。
答案 0 :(得分:2)
您必须了解事件处理程序在JavaScript中是异步的。这意味着对异步函数的调用没有输出,没有返回值。从异步函数获取数据的唯一方法是传入一个回调,只要输出可用就会调用 - 或者当你正在等待的事件发生时。
jQuery有一个相当优雅的deferred
API。我不是它与事件处理程序一起工作的方式,因为我不使用jQuery,但我想这应该是你应该去的,而不是这个...... 憎恶。
答案 1 :(得分:1)
Frits是正确的 - 事件处理程序无法返回值。你可以把它想象成一个警察的匿名提示:来电者向警方留下一些信息,警察对这些信息做了些什么。呼叫者可能已经触发了警方的回复,但是警察不知道信息来自何处,并且呼叫者对他的信息的使用方式没有影响。
那就是说,你可以很容易做你想做的事情,你只需要稍微重新安排一下......
var state = null;
$(window).bind('done', function (e) {
state = "my data";
equal("my data", state);
});
$(window).trigger('done');
答案 2 :(得分:1)
我也在寻找这个。虽然原则上从处理程序获取数据是错误的。无论如何,以下是这个想法
不,您无法从处理程序获取数据。因为以下几点 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.dispatchEvent
但是如果你正在使用JQuery(最有可能的话)
由于返回值将作为jQuery中的event.result存储在事件对象中,并且此事件对象将通过所有处理程序传递,因此在处理程序中,您可以通过此'获取先前的处理程序结果event.result'
原始事件触发器怎么样?
Jquery将通过以下代码将原始事件包装到另一个事件对象中
// Make a writable jQuery.Event from the native event object
event = jQuery.event.fix( event );
原始事件存储为event.originalEvent。如果确实需要将一些信息传递回原始事件触发器功能。解决方案只是将值放入该对象的属性
event.originalEvent.xxxx = xxxx;
答案 3 :(得分:0)
必须将JS代码的一部分移动为模块化(移动到可以插入的单独文件),如果使用模块,必须在一个地方重置knockout.js列表。
所以这段代码:
var treeSettings = eval(knockoutContext).Tree;
if (oldData === listArray) {
oldData = options.isObservable && !(treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) ? listArray().slice(0, rows.length) : [];
listArray(oldData);
}
成了这个:
if (oldData === listArray) {
oldData = options.isObservable ? listArray().slice(0, rows.length) : [];
$(document).trigger('OnTheMove_OfflineJSBeforeListArrayReused', {knockoutContext : knockoutContext, callback : function(){ oldData = [];}});
listArray(oldData);
}
并在单独的文件中。
$(document).on('OnTheMove_OfflineJSBeforeListArrayReused', function (e, options) {
var treeSettings = eval(options.knockoutContext).Tree;
if (treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) {
options.callback();
}
});
我知道处理程序和回调异步似乎仍能正常工作。