Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据a';兄弟姐妹';同一物体的_Javascript_Knockout.js - Fatal编程技术网

Javascript 根据a';兄弟姐妹';同一物体的

Javascript 根据a';兄弟姐妹';同一物体的,javascript,knockout.js,Javascript,Knockout.js,此代码将在以下情况下工作: var a = {}; a.b = ko.observable(1); a.c = ko.computed(function(){ return a.b() + 1; }); 这一个不会(显然): 假设我真的需要像第二段代码中那样定义我的对象,有什么方法可以解决这个问题吗?我有一个想法,其中包括try/catch和setTimeout,但这会很难看,所以我想听听是否有人有其他想法 编辑 事实证明,我不需要try/catch,只需要一个setTimeout,就可以将计

此代码将在以下情况下工作:

var a = {};
a.b = ko.observable(1);
a.c = ko.computed(function(){ return a.b() + 1; });
这一个不会(显然):

假设我真的需要像第二段代码中那样定义我的对象,有什么方法可以解决这个问题吗?我有一个想法,其中包括try/catch和setTimeout,但这会很难看,所以我想听听是否有人有其他想法

编辑 事实证明,我不需要try/catch,只需要一个setTimeout,就可以将计算延迟到运行时之后。但我还是想听听你对此的评论

var delayedComputed = function( comp, init ){
    var a = ko.observable( init ); 
    // added the initial value because some functions would like to use
    // string or array methods, and would fail to do so on an "undefined"
    setTimout(function (){ 
        var b = ko.computed( comp );
        b.subscribe(a);
        a(b());
    },1);
    return a;
},
a = {
    b : ko.observable(1),
    c : delayedComputed(function(){ return a.b() + 1; },"")
};

您必须使用像这样的构造函数

MyViewModel = function() {
   this.b = ko.observable(1);
   this.c = ko.computed(function() {
      return this.b() + 1;
   }, this);
}
然后

ko.applyBindings(new MyViewModel());
你可以尝试延迟评估来延迟。。。好。。。在实际访问之前对计算出的数据进行评估:

var a = {
   b : ko.observable(1),
   c : ko.computed({read: function(){ return a.b() + 1; }, deferEvaluation: true})
};

我知道如何构建viewmodel,谢谢。我的问题与viewmodels无关,但更一般。以上是第二个不起作用的代码示例的解决方案,请告诉我们您的用例是什么,而不是发布代码,也许我们可以帮助您完成一个好的解决方案。如果你的用例没有实际计时,那么使用setTimeout总是一种不好的做法。我的“用例”很简单,就像“我不想写一百次这个”:如果没有办法,那么显然我会写一百次这个,但是,我的解决方案很有效。为类似的事情引入延迟执行听起来并不理想。当然,有人会认为“this”是隐式的,但JS就是这样工作的,你只需要喜欢这种情况谢谢,我以前从来没有见过
deferEvaluation
标志。但是,如果我添加另一个属性
c:ko.computed(function(){return c()+1})
,这就行不通了。还是很高兴知道有这样一个标志,我不确定你想对上面的代码做什么-你用c()提取什么?如果你的意思是a.c(),那么它本身就是一个递归调用,据我所知,这是不允许的。等等,我的意思是
var a={b:..,c:..,d:ko.computed(function(){return a.c()+1}}
。很抱歉,在这种情况下,它仍然有效,但是您需要为每个必须延迟的计算可观察对象指定deferEvaluation修饰符。
var a = {
   b : ko.observable(1),
   c : ko.computed({read: function(){ return a.b() + 1; }, deferEvaluation: true})
};