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})
};