我在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不能在函数内定义
我该如何解决?
答案 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;”的定义将在内联函数定义中使用。
希望这有帮助。