我们正在实现一个相当复杂的单页面应用程序,并决定使用“Jquery-context-menu”工具箱。但是,我们有一个基本的问题,经过两天的搜索,并在网上阅读内容,我们有点想法。
基本问题是:如果,如果是,如何,可以从菜单外部访问更新功能(即禁用功能),同时菜单仍在? < / p>
场景: 我们正在实施一款游戏。我们使用“jquery上下文菜单”作为可以由用户激活的图标的上下文菜单(考虑rpg类型的图标)。通过点击激活后,它将自动解除激活(几秒钟后),然后在一段时间后再次准备重新激活。当菜单保持打开状态时,通过启用或禁用菜单,菜单捕获图标的状态是什么。
如下所示,有一个如何通过同一菜单中的按钮按钮更改菜单项可见性的示例:
http://medialize.github.io/jQuery-contextMenu/demo/disabled-changing.html
但是,我们的目标是从外部更新菜单(通过淘汰订阅呼叫)。所以我们想做类似的事情:
myknockoutobservable.subscribe(function(newValue){
correctRefernceToThis.data('disableItem1', newvalue)});
虽然禁用的功能看起来像是:
disabled: function(key, opt) {
return !this.data('cutDisabled')};
或者,如果这不起作用,我们可以直接调用更新功能
myKnockoutobservable.subscribe(function(newValue){
$.contextMenu.op.update(correctRefernceToOpt,correctRefernceToroot)});
然后在回调中查询knockout observable
if (!myKnockoutobservable) {
return true;}
else {
return false;
主要问题似乎是我们没有正确引用上下文,因此我们没有从Jquery上下文菜单外部处理正确的,opt,root,变量(至少那个是我们目前的意见)。如果有人可以帮助我们找到解决方案,或者甚至是一些好的想法尝试什么(我们还没有),我们将非常高兴。
答案 0 :(得分:0)
您没有订阅,您在视图模型中只有一个可设置为true或false的observable,并且菜单项将在响应中切换。菜单项的禁用成员将如下所示:
disabled: function() {
return myobservable();
}
正如James Thorpe评论的那样,您将要创建一个自定义绑定处理程序来设置上下文菜单。
听起来你正在使用几种不熟悉的工具。这是一个小提琴,有一个最小的例子:http://jsfiddle.net/sv3m7ok8/
<强>更新强>
我想到,由于上下文菜单没有绑定到单个元素,但使用选择器,因此在body
标记上进行绑定更有意义。所以更新的示例:http://jsfiddle.net/sv3m7ok8/1/
再次更新 我现在明白,当菜单打开时,你特意试图让菜单项启用/禁用(并且它通常不会这样做)。我不得不深入了解菜单项节点,并连接订阅以在其上设置禁用的类。
init: function (element, data, allbindings, data) {
var dynamicDisable = false;
$.contextMenu({
selector: '.context-menu-one',
callback: function (key, options) {
var m = "clicked: " + key;
window.console && console.log(m) || alert(m);
},
items: {
"edit": {
name: "Clickable",
icon: "edit",
disabled: function (opt, key) {
if (!dynamicDisable) {
var node = key.items.edit.$node[0];
data.disableMenu.subscribe(function (dis) {
$(node)[dis ? 'addClass' : 'removeClass']('disabled')
});
dynamicDisable = true;
}
return data.disableMenu();
}
}
}
});
}
我的小提琴设置一个间隔以切换disableMenu。您可以观看菜单项变为活动和灰色。
答案 1 :(得分:0)
感谢您的帮助!我理解你的方法,它确实是我们所做的:-)我可能在这个问题上并不是那么清楚,但这是当前禁用的回调代码。
disabled: function(key, opt) {
if (!self.item._blocks.Feature._processedStack().canBeActivated()) {
return true;
}
else {
return false;
}
}
这样可以使菜单处于关闭状态并再次重新启动状态时更新。但是,当菜单仍处于打开状态时,更新无效,因为没有任何内容触发菜单更新为新值。
目前我们正在尝试使用其他库来解决问题,我们会及时通知您。
最好,卡斯帕