淘汰赛追逐绑定事件
knockout chaning binding events
目前我无法触发依赖于淘汰赛中另一个绑定事件结果的绑定事件。
在下面的示例中,在"可用"输入中提供一个值,当"condition1"输入填充了诸如 22 的值时,应清除并禁用"可用"输入,所有这些都在跳过逻辑绑定中完成。这正在正常发生。
但是,问题在于在 chain1 输入元素上执行 skiplogic 绑定。在清除"可用"输入的值后,这甚至不会被触发。我怎样才能得到它,以便一个绑定的结果触发另一个绑定?
以下是代码的js小提琴版本: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:
此屏幕的整体视图模型以及初始状态 函数 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());
与其尝试单独保留条件,不如使用布尔逻辑在绑定中将它们串在一起? 这样,就不需要跟踪每个绑定状态。我构建了以下绑定:
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/
的update
函数将在元素首次绑定时执行(在init
函数之后),然后在其任何依赖项更改时再次运行。 通过访问函数中的可观察量来创建依赖项(例如计算对象内部,因为计算实际上用于促进绑定更新)。
因此,您需要确保通过调用 valueAccessor()
来检索传递给绑定的任何内容,然后如果该值是可观察的,则您希望将其作为函数调用以检索该值。 否则,如果您不确定是否已传递可观察量,则可以调用ko.unwrap
(在 2.3 之前,这是ko.utils.unwrapObservable
- 可以使用 2.3 后
此外,还可以通过使用 allBindingsAccessor
参数(第 3 个参数)或直接从数据(第 4 个参数)或上下文(第 5 个参数)访问值来访问传递给其他绑定的值。
传递具有同一元素的相同名称的多个绑定是行不通的。 您可能需要考虑以不同的方式构建它,例如data-bind="skipLogic: [one, two]"
传递数组,然后访问每个数组的值。
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 如何在tinymce编辑器中将点击事件绑定到html标签
- 如何将事件绑定到从AJAX请求注入的HTML
- 将click事件绑定到AngularJS指令中的子元素
- Jquery将事件绑定到页面上的多个实例
- 事件绑定到动态创建的元素
- 使用jQuery进行事件绑定
- 如何将单击事件绑定到其他类
- 更改事件绑定's函数在页面加载时调用
- Jquery事件绑定获胜'当作为方法调用时不起作用,但当直接在控制台中调用时会起作用
- 动态创建的DOM元素上的jQuery事件绑定
- 我是否可以使用 Angular 将鼠标向上事件绑定到文档正文
- 将事件绑定到除 data-rel= BACK 之外的所有锚标记
- 将函数事件绑定到更改函数的复选框/标签
- 使用 Angular 和 UI-bootstrap 对模态事件绑定无法工作的指令
- 聚合物 - 将事件绑定到动态创建的元素
- 将事件绑定到其他UI组件's函数,在Kendo MVVM中
- jQuery Mobile——事件绑定
- JQuery无法将模糊事件绑定到所有<输入>页面中的元素
- 将点击事件绑定到新元素&使得ID'是独一无二的