【问题标题】:why is knockout computed only called on input checkbox being cleared为什么只在清除输入复选框时才计算淘汰赛
【发布时间】:2017-02-01 01:18:35
【问题描述】:

当初始值为 true 时,ko.computed 仅在缺少所有真实新值的虚假新值上被调用。

同样,如果初始值为 false,则 ko.computed 仅在新的 true 值上调用。

$(function () {

            function getFormattedDate() {
                var date = new Date();
                var str = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();

                return str;
            }

            var ViewModel = function (initial_value) {

                var self = this

                self.debug_logs = ko.observableArray()

                self._my_checked = initial_value
                self.my_checked = ko.computed({
                    read: function () {
                        self.debug_logs.push({ log: "Reading value to " + self._my_checked + " " + getFormattedDate() })
                        return self._my_checked
                    },
                    write: function (value) {
                        self.debug_logs.push({ log: "Setting value to " + value + " " + getFormattedDate() })

                        self._my_checked = value
                    }
                })
            }

            ko.applyBindings(new ViewModel(true))

        })
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    <div>
         <input type="checkbox" data-bind="checked: my_checked" />  

        <ol data-bind="foreach:debug_logs">
            <li data-bind="text:log"></li>
        </ol>
    </div>

我需要在清除和设置复选框时调用计算。这将驱动其他未显示的功能。

提前谢谢你

【问题讨论】:

    标签: jquery knockout.js


    【解决方案1】:

    您的计算函数的读取函数只会在第一次触发并且永远不会再次触发,因为它没有任何可观察的对象来触发更新。如果您希望重新计算计算,则 my_checked 必须是可观察的。

    var ViewModel = function (initial_value) {
    
      var self = this
    
      self.debug_logs = ko.observableArray()
    
      self._my_checked = ko.observable(initial_value);
      self.my_checked = ko.computed({
        read: function () {
          self.debug_logs.push({ log: "Reading value to " + self._my_checked() + " " + getFormattedDate() })
          return self._my_checked()
        },
        write: function (value) {
          self.debug_logs.push({ log: "Setting value to " + value + " " + getFormattedDate() })
    
          self._my_checked(value);
        }
      })
    }
    

    接下来会遇到的问题是,每次写入值都会触发新的读取,因此每次更改值时都会同时获得“写入”日志和“读取”日志。您可能只想记录其中一个。

    【讨论】:

    • 谢谢。我假设“self.my_checked = ko.computed”本身就是一个可观察的。额外的阅读对我来说没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多