【问题标题】:CoffeScript class and bindingCoffeeScript 类和绑定
【发布时间】:2012-11-01 11:48:28
【问题描述】:

我在 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 不能在函数内部定义

我该如何解决?

【问题讨论】:

    标签: javascript class binding coffeescript


    【解决方案1】:

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

    pipe = (fn)->
        return ->
            fn.apply(@, arguments)
    
    
    class A
        foo: pipe -> @bar()
        bar: -> ...
    

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

    不需要胖箭头,因为你用@调用应用

    【讨论】:

      【解决方案2】:

      我认为 robkuz identified the problem 正确。解决办法应该是在构造函数里面设置validate属性:

      class Model
        constructor: (objectParams) ->
          @object = ##object
      
          @validate = ko.computed =>
            console.log ko.toJS @object
      

      【讨论】:

      • 我在stackoverflow.com/questions/13184209/…stackoverflow.com/questions/13184209/… 上放了这个问题和答案的更通用版本
      • @robkuz 我认为不明显的是validate 属性被设置为在类声明级别而不是在类方法内部调用的ko.computed 的返回值,因此绑定@ 给类构造函数。另外,我不确定在 SO 中是否鼓励提出一个问题来立即回答。
      • 这并不明显你是对的 - 仅仅是因为我试图回答一个更笼统的问题。 SO明确鼓励您回答自己的问题blog.stackoverflow.com/2011/07/…
      • @robkuz 酷,我不知道。感谢您的链接。
      【解决方案3】:

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

      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;”的定义它将在您的内联函数定义中使用。

      希望这会有所帮助。

      【讨论】:

      • 谢谢,但问题是另一个:ko.computed 是一个函数,它接受另一个我想绑定到实例的函数作为参数。这可能吗?
      • 这是您遇到此问题的另一个问答。这次负面表述:stackoverflow.com/questions/13189573/…
      猜你喜欢
      • 1970-01-01
      • 2011-12-27
      • 2013-01-08
      • 2011-12-07
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多