我正在将一些旧的JS代码重写为CoffeeScript,并在此过程中对其进行清理并将其转换为面向对象的格式。
我有一个用于用户编辑表单的Knockout.js视图模型。我还使用jQuery和基因敲除(Knockout.validation)进行客户端验证。我已经将其转换为CoffeesScript类,并且效果很好。现在,我要转换其他代码(其他视图模型),并且想为我的视图模型创建一个基类,其中包括所有这些视图模型所共有的一些代码。但是我发现在基类上调用的方法不起作用,而在子类上调用的方法却起作用。
这是一个示例-用户视图模型:
这是原始代码:
class User
constructor: (values)->
// set up the view model properties as knockout observables
// set up the validation rules
bindKnockout: (@selector)->
// create a validated observable viewmodel & bind it to the
// DOM elements
ko.applyBindings(ko.validatedObservable(@), $(@selector)[0])
这很好用。创建表单后,将实例化用户模型,并bindKnockout
调用该方法。
但是我的大多数或所有视图模型都将具有bindKnockout
相同的方法,因此我认为我将从基类继承该方法:
class ViewModel
bindKnockout: (@selector)->
// create a validated observable viewmodel & bind it to the
// DOM elements
ko.applyBindings(ko.validatedObservable(@), $(@selector)[0])
class User extends ViewModel
constructor: (values)->
// set up the view model properties as knockout observables
// set up the validation rules
但是,执行此操作时,在浏览器的控制台中出现错误:
Uncaught ReferenceError: Unable to process binding "disable: function (){return !isValid() }"
Message: isValid is not defined
Knockout抛出此错误,表明isValid
我的视图模型中没有可观察的对象。将isValid
观察到的是添加到由knockout.validation插件视图模型并返回指示该模型是否通过验证或不是一个布尔值。它在第一个示例(没有基类)中存在并且可以正常工作,但是一旦我将其移到基类中,它就会失败。
我已经检查了从源代码生成的Javascript。这是来自用户模型(不含基本模型)的原始代码:
User.prototype.bindKnockout = function(selector) {
this.selector = selector;
return ko.applyBindings(ko.validatedObservable(this), $(this.selector)[0]);
};
在第二种情况下,继承自基本模型:
Viewmodel.prototype.bindKnockout = function(selector) {
this.selector = selector;
return ko.applyBindings(ko.validatedObservable(this), $(this.selector)[0]);
};
假设代码相同,那么问题必须出在的绑定上this
,对吗?但是我console.log(@)
为这两种方法都做了一个,并且没有发现任何区别。
在这种情况下,谁能解释继承的工作方式(或不按我期望的方式工作)?
好,我知道了。
如上所述,我正在将一堆旧的Javascript转换为CoffeeScript。这需要进行一些重组,尤其是对jQuery&Knockout之类的依赖项。事实证明,我实际上两次包含了Knockout和Knockout.validation库-一次在我的HTML脚本标签中,一次在我的Javascript代码的依赖项中(我使用Browserify捆绑了所有内容)。似乎Knockout或Knockout.validation不喜欢这样...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句