我怎么能记住组合状态?

时间:2011-06-30 10:27:31

标签: javascript jquery json

我在Javascript中实现组合规则存在逻辑问题。

简而言之:

  • 我在JSON对象中定义了哪些复选框与其他复选框一起“on”。
  • 如果我点击措施1 - >;度量7和8变灰,这是正确的。
  • 如果我点击第4项 - >措施8,9,10和11变灰,这也是正确的。
  • 现在,如果我再次点击第4项 - >度量8再次激活,但不应该是,因为JSON'规则'表明,由于仍然检查了度量1,因此度量8必须是灰色的。

解决这个逻辑问题的智能方法是什么?提前谢谢!

基本上,我怎么记得单击'度量1'已经禁用'度量8',因此切换'度量4'不会意外地重新启用'度量8'而'度量1'仍然'在'?

此处的所有代码:https://gist.github.com/1055968

互动:http://jsfiddle.net/gnijholt/58zuR/

2 个答案:

答案 0 :(得分:0)

逻辑上我会做这样的事情:

  • 勾选复选框时,即可创建 存储规则的对象 适用。
  • 当我取消选中复选框时,我会 从内存中删除该规则 对象和解开每个之前 复选框我将通过内存 对象,看是否有任何 冲突的规则。如果有的话 冲突的规则,我不会灰色 复选框。

我正在尝试实现这一点。

编辑 - 我实现了我的想法。这是一个小提琴http://jsfiddle.net/Tvs7E/1/

function createObjectsWithRules(rulesApplied){
    var presentBlock = {};
    for (var checkboxid in rulesApplied){
      var presentCombos = rulesApplied[checkboxid];
       for(var key in presentCombos) {
           var obj = presentCombos[key];
           for(var prop in obj) {
              var s = obj[prop];
               presentBlock[s] = true;

           }
       }
    }
    return presentBlock;
}

        $(document).ready(function() {
            var rulesApplied= {};
            $('input').change(function() {
                current_cb = this;
                if ($(this).attr("checked")) {
                // toggle on

                    console.log("You ticked on " + current_cb.id);
                    combos = JSONSelect.match("." + current_cb.id, combinations);
                    rulesApplied[current_cb.id] = combos;
                    for(var key in combos) {
                        var obj = combos[key];
                        for(var prop in obj) {
                            var s = obj[prop];
                            $('#' + s).attr('disabled', 'disabled');

                            console.log("I disable " + obj[prop]);
                        }
                    }
                    console.log(rulesApplied);
                    return;
                }
                // toggle off
                console.log("You ticked off " + current_cb.id);
                combos = JSONSelect.match("." + current_cb.id, combinations);
                console.log(combos);
                delete rulesApplied[current_cb.id];
                console.log(rulesApplied);
                presentRules = createObjectsWithRules(rulesApplied);
                console.log(presentRules);

                for(var key in combos) {
                    var obj = combos[key];
                    for(var prop in obj) {
                        var s = obj[prop];
                        if (!presentRules[s]){
                          $('#' + s).removeAttr('disabled');
                          console.log("I enable " + obj[prop]);
                        }          
                    }
                }
                return;
            });
        });

答案 1 :(得分:0)

尝试将.change事件更改为此

http://paste.pocoo.org/show/424704/

它执行之前的操作,只是不使用空返回来模拟if-else。

然后当点击输入完成后,它会遍历所有输入以“重新禁用”任何需要禁用的内容。

只是轻轻地测试了

我可以看到,在我写这篇文章时,大卫在评论中提出了同样的建议。这是一回事,只需要一个代码示例。