访问ko.computed中的本地函数

时间:2014-07-10 07:52:14

标签: javascript jquery knockout.js requirejs durandal

为什么这行代码不起作用。

我正在使用durandal / knockout,我有这样的结构

define(function () {

    var vm = function() {

    compute: ko.computed(function() {
         return _compute(1); // fail
    });

    var _compute= function(e) {
        return e;
    }    
 }

 return vm;
});

基本上我只是试图访问私有方法_compute - 但是KO.compute不允许这样做?

即使我公之于众,我仍然无法访问它。 我试图在此实现revealing pattern,但仍然没有运气!

 var vm = function() {

    compute: ko.computed(function() {
         return this._compute(1); // still failing 
    });

    this._compute= function(e) {
        return e;
    }    
 }

更新:到目前为止,只有这一个

define(function () {

   var vm = function() {

   var self = this;

   var self._compute= function(e) {
        return e;
    } 

    compute: ko.computed(function() {
         return this._compute(1); // works
    }, self);

 }

但就像我说的那样,_compute并不意味着暴露。

更新:实际上是另一个错误。

这个现在有效了

define(function(){

   var vm = function() {

   var self = this;

   var _compute= function(e) {
        return e;
    } 

    compute: ko.computed(function() {
         return _compute(1); // works
    });

 }

基本上,只需要在ko.computed prop之前声明私有函数!

谢谢!

附加说明:

为什么需要在计算函数之前声明它?我更喜欢第一行中的所有“属性”而底部的函数。我认为它更整洁。

1 个答案:

答案 0 :(得分:3)

在函数中,此语法不会创建属性:

compute: ko.computed(function() {
     return _compute(1); // fail
});

您必须使用=代替:

试试这个

 var vm = function() {
    var self = this;
    var _compute = function(e) {
        return e;
    }
    this.compute = ko.computed(function() {
         return _compute(1);
    });    
 }

另请注意,这不是您应该使用computed可观察对象的方式。 它应该包含对其他可观察者的调用
来自doc

  

如果你有firstName的可观察量,而另一个有   lastName,你想显示全名吗?这是计算的地方   观察者进来 - 这些是依赖于一个或多个的功能   更多其他可观察者,并将随时自动更新   这些依赖关系会发生变化