简体   繁体   English

订阅时的淘汰赛计算得出的可观察值

[英]Knockout computed observable dont eval when subscribed

I am creating a ko.computedObservable like so: 我正在创建一个ko.computedObservable像这样:

var holder = ko.observable();

var makeAjax = function(){
   holder('new value');
};

var result = ko.computed({
    read: function () {

      makeAjax();
      return holder();
    },
    write: function (newValue) {
        //not relevant
    },
    deferEvaluation: true
});

I would like to be able to subscribe to result without causing the read function to execute. 我希望能够subscribe result而不会导致执行read功能。

result.subscribe(function(val){
   console.log(val);
});

However this call to subscribe causes read to execute. 但是,此订阅订阅导致read执行。 Is there any way to subscribe without causing it to execute? 有什么方法可以订阅而不会导致其执行?

What version of Knockout are you using? 您使用的是什么版本的Knockout? I can't re-create this behavior. 我无法重新创建此行为。 Here is a snippet I ran on JSbin with KO 3.0 and running it does not cause the result read function to evaluate until you call getResult() 这是我使用KO 3.0在JSbin上运行的代码段,运行该代码段不会导致结果读取函数评估,直到调用getResult()

var vm = function() {

    var holder = ko.observable();

    var makeAjax = function() {
        holder('new value');
    };

    var result = ko.computed({
        read: function() {
            console.log('excuting read')
            makeAjax();
            return holder();
        },
        write: function(newValue) {
            console.log('setting holder to ' + newValue)
                //not relevant
            holder(newValue)
        },
        deferEvaluation: true
    });


    result.subscribe(function(val) {
        console.log(val);
    });

    this.getResult = function() {
        return result;
    }
    this.setResult = function(val) {
        result(val);
    }
}

var VM = new vm();


ko.applyBindings(VM);

VM.setResult("test");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM