CoffeeScript类和绑定

时间:2012-11-01 11:48:29

标签: javascript class binding coffeescript

我在CS学习了一门课程:

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

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

问题在于'validate'它是一个原型属性,其中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不能在函数内定义

我该如何解决?

3 个答案:

答案 0 :(得分:1)

我认为robkuz identified the problem正确。解决方案应该是在构造函数中设置validate属性:

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

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

答案 1 :(得分:1)

将您的函数绑定到实例并“预处理”它就像这样工作

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


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

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

不需要使用胖箭头,因为您正在呼叫@

答案 2 :(得分:0)

如果你在将一个函数与一个类(原型)相关联之前“建议”一个函数,那么通常会在使用胖箭头时对该实例进行绑定。

class A
    foo: advise => @someMethod()

中介建议功能断开CS编译器的连接,使其不清楚你想做什么,以便没有调用

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

在构造函数中。

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

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

这将生成

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

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

希望这有帮助。