在类中初始化自定义ko.computed

时间:2014-01-30 11:21:53

标签: javascript knockout.js scope

我不知道是否可能,但我想实现这样的目标:

function templateCheck(Properties,ComputedFunction){
   var self = this;
   self.Prop1 = ko.observable(Properties.Prop1);
   self.CustomCaltulation = ko.computed(ComputedFunction);
   return {
      returningValue: self.CustomCalculation
   }
}

// This doesn't work
var test = new templateCheck({Prop1: "something"},function(){ return self.Prop1(); })
// Error: TypeError: Object [object global] has no method 'Prop1'

到目前为止,我没有成功实现这一目标。

3 个答案:

答案 0 :(得分:2)

不需要'自我'变量。它实际上让你变得更难,因为你发现,'self'不是在templateCheck的上下文之外定义的。诀窍是使用计算变量的'owner'属性,它设置this

的'含义'
function templateCheck(Properties, ComputedFunction){
    this.Prop1 = ko.observable(Properties.Prop1);
    this.CustomCalculation = ko.computed({
        read: ComputedFunction,
        owner: this
    });
    return {
        returningValue: this.CustomCalculation
    };
}

var test = new templateCheck({Prop1: "something"},function(){ return this.Prop1(); })

我确实想知道你为什么要这样做。感觉有点像代码味道给我。也许有更好的方法?

答案 1 :(得分:0)

您的问题是您的函数上下文中未定义自变量。

function templateCheck(Properties){
   var self = this;
   self.Prop1 = ko.observable(Properties.Prop1);

    self.setComputedFunction(computedFunction) {
        self.customCalculation = ko.computed(computedFunction);     
    }
}

var template = new templateCheck({Prop1: "something"});
var myComputedFunction = function(){ return template.Prop1(); };
template.setComputedFunction(myComputedFunction);

var test=template.customCalculation;

答案 2 :(得分:0)

您已撰写self.CustomCaltulation而不是self.CustomCalculation。这可能不是您的问题,但很快我就会发现您的问题。