Windows 8 WinJS-防止两次快速按钮按下

Windows 8 WinJS-防止两次快速按钮按下,windows-8,windows-store-apps,winjs,double-click,Windows 8,Windows Store Apps,Winjs,Double Click,在WinJS中的一个应用程序中,我们的序列化数据是从磁盘上的文件读取的,根据页面的不同,文件的不同部分会被访问 我们遇到的问题是,当用户双击控件、按钮、列表视图等时,系统将尝试读取文件两次,并且偶尔会发生爆炸 WinJS中是否有建议的路由来防止或处理控件上的双重按下?除了按下时手动禁用和重新启用所有按钮之外 我们已经研究了一些选项,包括覆盖addEventListener,但没有一个是完美的,在这方面的任何建议都将不胜感激 附加:在本例中,问题是读取文件,但在其他应用程序中,对列表执行快速双击将

在WinJS中的一个应用程序中,我们的序列化数据是从磁盘上的文件读取的,根据页面的不同,文件的不同部分会被访问

我们遇到的问题是,当用户双击控件、按钮、列表视图等时,系统将尝试读取文件两次,并且偶尔会发生爆炸

WinJS中是否有建议的路由来防止或处理控件上的双重按下?除了按下时手动禁用和重新启用所有按钮之外

我们已经研究了一些选项,包括覆盖addEventListener,但没有一个是完美的,在这方面的任何建议都将不胜感激


附加:在本例中,问题是读取文件,但在其他应用程序中,对列表执行快速双击将尝试导航到页面两次(并将其添加到nav.history中两次),因此,似乎有很多地方和症状会发生这种情况。

最好的方法是在处理过程中禁用按钮,并在完成后重新启用按钮。如果时间比预期的长,这将为用户提供适当的反馈

您可以通过数据绑定禁用它们,而不是手动设置它们

HTML


--Rob

您是否可以在每次按下按钮时设置一个变量,例如“ProcessingValue”,所有按钮在继续之前都会进行检查?嗨,Nate,这是我们正在考虑的建议之一,缺点是这可能会在应用程序的许多区域触发,我们需要多次编写相同的代码,或者看看重写addEventListener并使所有底层侦听器函数返回承诺的方法,这样我们就可以在完成“processingvalue”后将其设置回原来的值。嗨,Rob,这不是个坏主意,只是我们非常需要在任何按键、按钮、列表上实现它,超链接等都有稍微不同的“禁用”行为,我们需要实施。此外,我们认为按钮按下超时5秒的建议“可能”有效,但我们似乎无法有效地知道按钮的“工作”何时完成,除非我们使用的每个处理程序都返回一个承诺,而有些人返回了承诺,很多人不这样做,将它们全部改成这种方式将是相当重要的工作。5秒的超时时间是你的应用程序需要做的任何工作的占位符。你不会希望在真正的应用程序中出现这种情况。大多数控件将以相同的方式绑定到disabled,您可以在绑定源中包含其他属性,并编写一个函数,将它们全部设置为disabled/enable。如果您无法知道工作何时完成,那么在工作进行过程中防止双重访问的任何方法都将很困难。提示:如果承诺进入错误状态,则应将“禁用”设置为false,否则按钮将永远禁用。这对于缺少的
WinJS.Promise.finally
method:)是一个完美的例子,然后您可以编写
WinJS.Promise.timeout(5000)。finally(function(){bindingSource.disabled=false;})
<button id="button1" data-win-bind="disabled: disabled">Click</button>
<button id="button2" data-win-bind="disabled: disabled">Click</button>
<button id="button3" data-win-bind="disabled: disabled">Click</button>
<button id="button4" data-win-bind="disabled: disabled">Click</button>
var bindingSource;

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize
            // your application here.
        } else {
            // TODO: This application has been reactivated from suspension.
            // Restore application state here.
        }
        args.setPromise(WinJS.UI.processAll());

        var disabledContext = { disabled: false }

        var btn = document.getElementById("button1");
        btn.addEventListener("click", buttonClickHandler, false);
        WinJS.Binding.processAll(btn, disabledContext);

        btn = document.getElementById("button2");
        btn.addEventListener("click", buttonClickHandler, false);
        WinJS.Binding.processAll(btn, disabledContext);

        btn = document.getElementById("button3");
        btn.addEventListener("click", buttonClickHandler, false);
        WinJS.Binding.processAll(btn, disabledContext);

        btn = document.getElementById("button4");
        btn.addEventListener("click", buttonClickHandler, false);
        WinJS.Binding.processAll(btn, disabledContext);

        bindingSource = WinJS.Binding.as(disabledContext);
    }
};

function buttonClickHandler(eventInfo) {
    bindingSource.disabled = true

    WinJS.Promise.timeout(5000).then(function (c) {
        bindingSource.disabled = false
    });
}