0

目前,我无法触发依赖于淘汰赛中另一个绑定事件的结果的绑定事件。

在下面的示例中,在 'available' 输入中提供一个值,当 'condition1' 输入填充了诸如 22 之类的值时,应清除和禁用 'available' 输入,所有这些都在跳过逻辑绑定中完成. 这正在正常发生。

但是,问题在于在chain1 输入元素上执行skiplogic 绑定。在“可用”输入被清除其值后,这甚至不会被触发。我怎样才能得到它,以便一个绑定的结果触发另一个绑定?

这是下面代码的js fiddle版本:http: //jsfiddle.net/gYNb8/2/

这是我用来测试这个概念的表格:

<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<span>Condition 1</span> 
<input id="condition1" data-bind="value: condition1" />
<br/>
<span>Condition 2</span> 
<input id="condition2" data-bind="value: condition2" />
<br/>
<span>Available?</span> 
<input id="available" data-bind="value: available, skipLogic: condition1, skipLogic: condition2" />
<br/>
<span>Chain1</span> 
<input id="chain1" data-bind="value: chain1, skiplogic: available" />

这是javascript:

// 此屏幕的整体视图模型,以及初始状态 function ReservationsViewModel() { var self = this;

    self.condition1 = ko.observable();
    self.condition2 = ko.observable();
    self.available = ko.observable();
    self.chain1 = ko.observable();

}

//Here are the conditions which govern whether an element should be enabled or not
var elementConditions = {
    'available': [{
        'Condition': 'condition1() > 0',
        'Type': 'evaluation'
    }, {
        'Condition': 'condition2() > 0',
        'Type': 'evaluation'
    }],
        'chain1': [{
        'Condition': 'available',
        'Type': 'empty'
    }]
};


ko.bindingHandlers.skipLogic = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {


        var id = $(element).attr("id");
        var conditions = elementConditions[id];
        var isSkipped = false;
        var conditionMet = false;

        for (var i = 0; i < conditions.length; i++) {
            conditionMet = false;
            if (conditions[i].Type == "evaluation") {
                conditionMet = eval('viewModel.' + conditions[i].Condition);
            } else if (conditions[i].Type == "empty") {
                if ($('#' + conditions[i].Condition).val().length == 0) {
                    conditionMet = true;
                }
            } else if (conditions[i].Type == "notempty") {
                if ($('#' + conditions[i].Condition).val().length > 0) {
                    conditionMet = true;
                }
            }

            if (conditionMet == true) {
                isSkipped = true;
            }
        }

        if (isSkipped) {
            eval("viewModel." + id + "('');");            
            $(element).attr("disabled", "disabled");
        } else {
            if (elementSkipped[id] > 0) {
                $(element).attr("disabled", "disabled");
            } else {
                $(element).removeAttr("disabled");
            }
        }
    }
};

ko.applyBindings(new ReservationsViewModel());
4

2 回答 2

0

您可以使用布尔逻辑在绑定中将它们串在一起,而不是尝试单独保留条件吗?这样您就不需要跟踪每个绑定状态。我已经建立了以下绑定:

ko.bindingHandlers.skipLogic = {
init: function(element, valueAccessor) {
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    var valueOfCondition = ko.unwrap(valueAccessor());
    var jqElement = $(element);       

//update if the field is disabled if more than one condition is met        
        if(valueOfCondition){
            jqElement.prop('disabled', true);
        }
        else{
            jqElement.prop('disabled', false);
        }
     }
};

一个工作示例在这里:http: //jsfiddle.net/M7vUV/3/

于 2013-09-08T21:07:42.287 回答
0

绑定的update函数将在第一次绑定元素时(在init函数之后)执行,然后在其任何依赖项发生变化时再次运行。您可以通过访问函数内的可观察对象来创建依赖项(就像在计算内部一样,因为计算实际上用于促进绑定更新)。

因此,您需要确保通过调用来访问检索传递给绑定的任何内容valueAccessor(),然后如果该值是可观察的,您可能希望将其作为函数调用以检索该值。否则,如果您不确定是否已通过 observable,您可以调用ko.unwrap(在 2.3 之前这是ko.utils.unwrapObservable- 在 2.3 之后可以使用)。

allBindingsAccessor此外,您可以通过使用参数(第 3 个参数)或直接从数据(第 4 个参数)或上下文(第 5 个参数)访问值来访问传递给其他绑定的值。

传递同一个元素的同名的多个绑定是行不通的。您可能需要考虑以不同的方式构造它,例如传递一个数组data-bind="skipLogic: [one, two]",然后访问每个数组的值。

于 2013-09-06T18:14:11.697 回答