小编T.K*_*nta的帖子

.bind("move_node.jstree",.. - > data.rslt.obj undefined.如何获取节点数据?

我有check_move的自定义功能:

crrm : {
        move : {
            "check_move" : function (m) {

                var p = this._get_parent(m.o);
                if(!p) 
                    return false;
                if(m.cr===-1)
                    return false;
                return true;        
                }

        }   
    },
Run Code Online (Sandbox Code Playgroud)

这似乎按预期工作.然后我尝试绑定到"move_node"事件来更新我的数据库:

.bind("move_node.jstree",function(event,data){
    if(data.rslt.obj.attr("id")==""){
         /* I omitted this snippet from this paste - it's really long and it basically does the same thing as below, just gets the node's id in a more complicated way*/
    } else { 
        controller.moveNode(data.rslt.obj.attr("id"),data.inst._get_parent(this).attr("id"),data.rslt.obj.attr("rel"));
    }   
})
Run Code Online (Sandbox Code Playgroud)

这会导致错误.data.rslt.obj未定义.我真的很想做什么,我之前已经和多个事件结合了,这就是我做到的.

如果data.rslt.obj不起作用,如何在move_node事件之后获取节点属性等?

哦,controller.moveNode()是我自己的函数之一,所以如果你想学习jstree,不要只复制粘贴.

jstree

6
推荐指数
1
解决办法
8447
查看次数

使用RxJS模拟命令队列和撤消堆栈

我正在尝试使用RxJS 复制此演示.该演示是一个小应用程序,用户控制机器人.机器人可以向前或向后移动,向左或向右旋转,以及拾取或放下物品.用户可以对命令进行排队(例如"前进","旋转"),并且当用户单击"执行"按钮时,将执行队列中的命令.用户还可以撤消已执行的命令.

传统上,使用尚未执行的命令的队列实现此应用程序将非常容易.执行的命令被压入堆栈,每当按下撤销按钮时,顶部命令将被弹出并撤消.

我能够"收集"命令并通过执行以下操作来执行它们:

var id = 0;
var add = Rx.Observable.fromEvent($("#add"), 'click').map(function(){
  var ret = "Command_"+id;
  id++;
  return ret
})
var invoke = Rx.Observable.fromEvent($("#invoke"), 'click')
var invokes = add.buffer(invoke)
Run Code Online (Sandbox Code Playgroud)

buffer()方法将流转换为数组流.我可以订阅调用流并获取命令数组:

invokes.subscribe(function(command_array){...})
Run Code Online (Sandbox Code Playgroud)

或者我可以创建一个Rx.Subject(),我只是逐个推送命令:

var invoked_commands = new Rx.Subject()
invokes.subscribe(function(command_array){
  for(var i=0; i < command_array.length; i++){
    invoked_commands.onNext(command_array[i])
  }
});

invoked_commands.subscribe(function(command){ ...});
Run Code Online (Sandbox Code Playgroud)

说实话,我不知道哪种方法会更好,但我再一次不知道这对我来说是否过于相关.我一直试图弄清楚如何实现撤消功能,但我完全不知道如何去做.

在我看来,它必须是这样的(抱歉格式化):

-c1 --- C2-C3 --------->

---------------- u --- u->("你"=点击撤消按钮)

---------------- c3 - c2>(从最新到最旧的命令,调用undo()方法)

所以我的问题是双重的:

  1. 我收集命令的方法好吗?
  2. 如何实现撤消功能?

编辑:我正在比较变形和反应风格,我正在使用两者来实现这个演示.因此,我想尽可能坚持使用Rx*功能.

javascript reactive-programming system.reactive rxjs

5
推荐指数
1
解决办法
2572
查看次数

在表单中使用jstree复选框

对不起有点含糊不清的标题.我的问题非常具体(而且可能只是我是一个新手),我只是不知道如何在标题中解释它.

我目前正在升级网页.该网页有3个列表,其中包含项目,例如"设备"列表中有不同类型的汽车.每个项目都有一个复选框,用户检查他想要使用的复选框,然后按下一个按钮.然后他根据他的选择收到一份报告.

<input type="button" class="mapbutton"  onclick="company.view.reports.serialize(this);" 
                style="width:280px;font-size:1em" 
                value="<fmt:message key="owner.text.open_report" />" />
Run Code Online (Sandbox Code Playgroud)

这是按钮的代码.

serialize: function(what){
              var m = company.model.report;
              var strDev = 'devices=';
              var devicesCB = $(".devicesCB:checked");
              if (devicesCB.length > 0){
                  for (var i=0;i<devicesCB.length;i++) {
                     strDev += devicesCB[i].value + ',';
                  }
                  strDev = strDev.substring(0, strDev.length - 1);
              }
Run Code Online (Sandbox Code Playgroud)

这是用户按下按钮时触发的序列化函数的一部分.该$(".devicesCB:checked")部分是jQuery,并返回该类的所有选中复选框"devicesCB".这条线也是我问题的关键.

checkbox : {
        "real_checkboxes" : "true",
        "override_ui" : "true",
        "real_checkboxes_names" : function(n){
            console.log("As");
            return[("area"+n[0].id),n[0].id];
        }
    },
Run Code Online (Sandbox Code Playgroud)

根据jstree文档,这应该创建在表单中工作的复选框.有什么想法我会如何检索这些数据?我已经尝试了var cb = $(".jstree-checkbox:checked"),它没有真正做任何事情,我也试过使用树的选择器,var areasCB = $("#tree");但我无法弄清楚如何处理它.

我很确定这是一个相当简单的问题,但我对jQuery和javascript仍然很新.

jquery jquery-selectors jstree

3
推荐指数
1
解决办法
3150
查看次数