Javascript 击倒更改绑定事件

Javascript 击倒更改绑定事件,javascript,jquery,events,knockout.js,Javascript,Jquery,Events,Knockout.js,目前,我无法触发依赖于敲除中另一个绑定事件结果的绑定事件 在下面的示例中,在“可用”输入中提供一个值,当“condition1”输入填充了一个值,例如22时,“可用”输入应被清除和禁用,所有这些都在跳过逻辑绑定中完成。这是正确的 但是,问题在于在chain1输入元素上执行skiplogic绑定。在清除“可用”输入的值后,甚至不会触发此命令。我如何才能得到它,使一个绑定的结果触发另一个绑定 下面是js fiddle版本的代码: 以下是我用来测试概念的表格: <script src="http

目前,我无法触发依赖于敲除中另一个绑定事件结果的绑定事件

在下面的示例中,在“可用”输入中提供一个值,当“condition1”输入填充了一个值,例如22时,“可用”输入应被清除和禁用,所有这些都在跳过逻辑绑定中完成。这是正确的

但是,问题在于在chain1输入元素上执行skiplogic绑定。在清除“可用”输入的值后,甚至不会触发此命令。我如何才能得到它,使一个绑定的结果触发另一个绑定

下面是js fiddle版本的代码:

以下是我用来测试概念的表格:

<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" />

条件1

条件2
有空吗?
链1
下面是javascript:

//此屏幕的整体视图模型以及初始状态 函数ReservationsViewModel(){ var self=这个

    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());
self.condition1=ko.observable();
self.condition2=ko.observable();
self.available=ko.observable();
self.chain1=ko.observable();
}
//以下是控制是否应启用元素的条件
var elementConditions={
“可用”:[{
“条件”:“条件1()>0”,
“类型”:“评估”
}, {
“条件”:“条件2()>0”,
“类型”:“评估”
}],
“链1”:[{
“条件”:“可用”,
“Type”:“empty”
}]
};
ko.bindingHandlers.skipLogic={
更新:函数(元素、valueAccessor、allBindingsAccessor、viewModel){
var id=$(元素).attr(“id”);
变量条件=元素条件[id];
var Isskiped=false;
var-conditionMet=false;
对于(变量i=0;i0){
条件满足=真;
}
}
if(conditionMet==true){
Isskiped=真;
}
}
如果(已禁用){
评估(“视图模型”。+id+”(“);”);
$(元素).attr(“禁用”、“禁用”);
}否则{
if(元素跳过[id]>0){
$(元素).attr(“禁用”、“禁用”);
}否则{
$(元素).removeAttr(“禁用”);
}
}
}
};
应用绑定(新的ReservationsViewModel());

当元素第一次绑定时(在
init
函数之后),将执行绑定的
更新
函数,然后在其任何依赖项更改时再次运行。您可以通过访问函数中的可观察项(比如在computed中,因为computed实际上用于促进绑定更新)来创建依赖项

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

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


使用同一元素的相同名称传递多个绑定将不起作用。您可能需要考虑构造不同的方式,比如传递数组<代码>数据绑定=“SkyIpLogic:[1,2 ] < /Cord>,然后访问每个值。

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

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);
        }
     }
};

这里有一个工作示例:

您能再详细一点吗?为什么skiplogic:if(isSkipped){eval(“viewModel.”+id+“('');”);$(element).attr(“disabled”,“disabled”);}else{if(elementSkipped[id]>0)时,在“chain1”输入上没有触发“可用”输入时,skiplogic:{$(element).attr(“disabled”,“disabled”);}else{$(element).removeAttr(“disabled”);}这里有几个问题。首先,您在
chain1
元素上指定了
skiplogic
而不是
skiplogic
。绑定区分大小写。其次,对于
empty
notempty
条件,您将希望访问可观察对象的值以创建依赖项。因此,而不是读取字段的值,可能类似于:
viewModel[conditions[i].Condition]()
。此语法将允许您动态指定要访问的属性名称,而无需执行诸如求值之类的操作。此外,您还有一个未定义的elementSkipped变量。以下是已修复的问题:。总体而言,我认为使用computed observa将此逻辑放在视图模型中可能更好然后对元素使用普通绑定(以启用/禁用元素)。感谢您回答我的问题