可以将多个函数绑定到Knockout中的已检查事件,如此代码段吗?
代码段:
<input type="radio" name="requestType" data-bind="value: id, checked: checkedRequestTypeId, isRequestTypeIdChecked" />
<script type="text/javascript">
var viewModel = function() {
//...
checkedRequestTypeId = ko.observable();
isRequestTypeIdChecked = function(){
//some logic inside
}
//...
};
ko.applyBindings(new viewModel());
</script>
或者我只能绑定一个函数并在此函数中调用两个不同的函数?
答案 0 :(得分:2)
不,你不能,不能使用内置的checked
绑定。你可以写一个custom binding handler,如果你真的想要一个(写一个重复使用或分叉the built in binding),但有一种更简单的方法来获得类似的东西。
我建议使用可写的计算机。无论如何,你需要它来封装双向绑定位。换句话说,请注意,您可以通过编程方式更改checkedRequestTypeId
和isRequestTypeIdChecked
,并且您必须决定是否应在这些情况下选中复选框。
您没有提供有关边缘情况的逻辑的详细信息,但这是一个让您入门的示例:
function ViewModel() {
var self = this;
self.checkedRequestTypeId = ko.observable(false);
self.isRequestTypeIdChecked = ko.observable(true);
self.requestTypeCheckedness = ko.computed({
read: function() {
return self.checkedRequestTypeId() && self.isRequestTypeIdChecked()
? "1"
: "2";
},
write: function(newVal) {
self.checkedRequestTypeId(newVal === "1");
self.isRequestTypeIdChecked(newVal === "1");
}
});
}
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input type="radio" name="requestType" value="1" data-bind="checked: requestTypeCheckedness" /> 1
<br>
<input type="radio" name="requestType" value="2" data-bind="checked: requestTypeCheckedness" /> 2
<hr>
Debug info: <pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
PS。我也支持Stanislav Machel's solution作为解决此问题的另一种方法。无论哪个最好取决于背景,真的。
答案 1 :(得分:1)
我认为在您的情况下,您可以使用subscribe函数来关注checkedRequestTypeId:
<input type="radio" name="requestType" data-bind="value: id, checked: checkedRequestTypeId, isRequestTypeIdChecked" />
<script type="text/javascript">
var viewModel = function() {
//...
checkedRequestTypeId = ko.observable();
this.checkedRequestTypeId.subscribe(function(){
//some logic inside
}
};
ko.applyBindings(new viewModel());
</script>
我希望我的回答能对你有所帮助。 您可以在此处阅读更多详细信息:http://knockoutjs.com/documentation/observables.html