CoffeeScript中对基类方法和子类方法的调用之间有什么区别?

克里滕

我正在将一些旧的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

以下委托方法调用之间有什么区别?

NumPy对象方法和NumPy函数调用之间有什么区别?

C#中这两个方法调用之间有什么区别?

普通方法调用与本机方法调用之间有什么区别?

在带和不带self的in class方法中调用的Ruby类方法之间有什么区别吗?

之间有什么区别?和T在类和方法签名中?

LinkedList类中的element()和getFirst()方法之间有什么区别?

Fabric-Client模块的CertificateAuthority类中的getCaName()和getName()方法之间有什么区别?

Qt中的插槽和方法之间有什么区别?

函数调用之间有什么区别?

R6中自身和私有方法调用之间的区别

类方法和元类方法之间有什么区别?

iText的getPageN()和getPageNRelease()调用之间有什么区别?

apply()函数和使用该类的对象的函数调用之间有什么区别?

无限循环和无限递归调用之间有什么区别?

__weak和__block引用之间有什么区别?

C ++中的两个副本构造函数调用之间有什么区别?

在c#中对异步Func <Task <T >>的3个调用之间有什么区别?

在Django世界中,项目和应用之间有什么区别?

在Django世界中,项目和应用之间有什么区别?

OCaml中的let绑定和引用之间有什么区别?

类构造函数内的函数和内部类但外部构造函数(在js中)之间的方法有什么区别?

类方法和实例方法有什么区别?

Windows上的DirectX API(和OpenGL API调用)与常规系统调用之间有什么区别?

javascript 类方法 w/o 和 w function 关键字之间有什么区别?

Scanner类的next()和nextLine()方法之间有什么区别?

numpy.random的Generator类和np.random方法之间有什么区别?

TabLayout的setScrollPosition和getTabAt方法之间有什么区别?

ConfigureWebHostDefaults和ConfigureWebHost方法之间有什么区别?