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