1

我有一个CS课:

class Model
  constructor: (objectParams) ->
    @object = ##object
    ###constructor

  baseObject: => {}
  validate: ko.computed =>
    console.log ko.toJS @object

问题在于“验证”它是一个原型属性,其中 ko.computed 函数的绑定上下文应该是构造函数,而是编译为此:

Model.prototype.validate = ko.computed(function() {
  return console.log(ko.toJS(Model.object));
});

我希望它绑定到构造函数,但胖箭头 => 似乎只能以这种方式工作:

property: () =>

这样它就行不通了

  validate: =>
    ko.computed => console.log ko.toJS @object

因为 ko.computed 不能在函数内部定义

我该如何解决?

4

3 回答 3

1

我认为 robkuz正确地识别了问题。解决方案应该是validate在构造函数中设置属性:

class Model
  constructor: (objectParams) ->
    @object = ##object

    @validate = ko.computed =>
      console.log ko.toJS @object
于 2012-11-01T14:56:58.683 回答
1

将您的函数绑定到实例并“预处理”它的工作方式如下

pipe = (fn)->
    return ->
        fn.apply(@, arguments)


class A
    foo: pipe -> @bar()
    bar: -> ...

从您的管道函数(在您的情况下为 ko.computed)返回另一个函数,该函数包装您的初始函数并通过 .apply 调用它。

不需要胖箭头,因为您使用 @ 调用 apply

于 2012-11-02T05:49:32.290 回答
0

如果在将函数与类(原型)关联之前“建议”函数,则不会绑定到通常使用粗箭头发生的实例。

class A
    foo: advise => @someMethod()

中介建议功能断开 CS 编译器,使其不清楚您想要做什么,因此没有调用

this.foo = __bind(this.foo, this); 

在构造函数中。

但是,如果您确实在方法定义中使用了“建议”功能,那么 CS 将为您创建一个闭包,您将可以访问该实例

class A
    foo: ->
         advise => @someMethod()

这将产生

A.prototype.foo = function() {
    var _this = this;
    return advise(function() {
       return _this.someMethod();
    });
};

这里重要的是“var _this = this;”的定义 它将在您的内联函数定义中使用。

希望这可以帮助。

于 2012-11-01T12:41:36.360 回答