【发布时间】:2016-09-13 13:38:10
【问题描述】:
我有以下 TypeScript 为我的视图上的可点击元素定义了一个 KnockoutJS 绑定处理程序:
module MyModule {
export interface ICopyButtonParams {
dataUrl: string;
}
ko.bindingHandlers.copyButton = {
init: (element: HTMLElement, valueAccessor: () => ICopyButtonParams) => {
var options: any = ko.utils.unwrapObservable(valueAccessor());
if (!options.dataUrl) {
return;
}
new Clipboard(element, {
text: () => {
var clipboardData: string;
$.ajax({
url: options.dataUrl,
type: "GET",
contentType: "application/json",
cache: false,
async: false,
success: (result: SubmitResult) => {
clipboardData = result.Data;
}
});
return clipboardData;
}
});
}
};
}
此绑定处理程序的作用是将可单击元素转换为启用Clipboard.JS 的元素,该元素在单击时将字符串存储在剪贴板中。在我的例子中,我想利用 Clipboard.JS 的动态文本功能,您可以将一个函数传递给 Clipboard 构造函数,该构造函数返回要存储在剪贴板中的文本。在这个函数中,我想调用一个返回要存储的文本的 API。
由于这种架构的性质,我无法使用带有成功回调的标准 ajax 调用,因为这意味着剪贴板文本无法及时解析。
作为权宜之计,您会在我的代码中注意到我已使我的 ajax 调用异步(不好,我知道)。由于从 JQuery 1.8 开始不推荐使用“异步”标志,我正在尝试考虑另一种方法。
有什么想法吗?
【问题讨论】:
-
为什么不先调用一个异步ajax,然后在成功回调中创建Cliboard对象呢?
-
重点是我不想检索要放入剪贴板的数据,除非需要(即有人单击“复制到剪贴板”按钮)。页面上可能有 100 多个可以复制到剪贴板的内容,每个都包含许多文本字符。如果我要使用它应该存储的数据对每个剪贴板按钮进行预初始化,我不妨使用视图模型的其余部分检索剪贴板文本并完全取消 ajax 调用。值得指出的是,复制到剪贴板的内容绝不会显示在页面上。
-
也许我不理解你的意思,但你应该只把 data-bind="copyButton: {}" 放在你想要这样行为的元素上,或者?
-
正确,但我只希望这些元素在单击时加载其相应的剪贴板文本。
-
在这种情况下,我可能只是创建一个函数,例如在按钮上单击绑定时调用该函数。
标签: ajax asynchronous knockout.js typescript clipboard.js