绑定到已检查事件的多个函数

时间:2016-12-06 06:57:09

标签: javascript knockout.js

可以将多个函数绑定到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>

或者我只能绑定一个函数并在此函数中调用两个不同的函数?

2 个答案:

答案 0 :(得分:2)

不,你不能,不能使用内置的checked绑定。你可以写一个custom binding handler,如果你真的想要一个(写一个重复使用或分叉the built in binding),但有一种更简单的方法来获得类似的东西。

我建议使用可写的计算机。无论如何,你需要它来封装双向绑定位。换句话说,请注意,您可以通过编程方式更改checkedRequestTypeIdisRequestTypeIdChecked,并且您必须决定是否应在这些情况下选中复选框。

您没有提供有关边缘情况的逻辑的详细信息,但这是一个让您入门的示例:

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