【问题标题】:Knockout $parent and Typescript overridden function淘汰 $parent 和 Typescript 重写函数
【发布时间】:2014-10-22 14:41:35
【问题描述】:

我有一个 typescript 类 B,它继承 typescript 类 A。

A 类有一个名为 Model 的 KnockoutObservable。

A 类有一个名为 GetSomeNumber() 的函数,它返回一个数字

export class A{ 
    Model: KnockoutObservable<C>;
    constructor(){ this.Model = ko.observable(new C()); } 
    GetSomeNumber (): number { return 1; }
}

类 B 扩展类 A 并覆盖函数 GetSomeNumber()

export class B extends A{
    GetSomeNumber(): number { return 2; }
}

在 Knockout 绑定中,我在绑定到 B 类实例上的模型的元素上引用 $parent.GetSomeNumber()

我收到以下错误...

无法获取未定义或空引用的属性“GetSomeNumber”

但是,如果我从 B 类中删除覆盖,它确实有效。

【问题讨论】:

  • 另外,当敲除绑定时,为了确保您获得正确的this,有时需要将您的函数调用包装在匿名函数中,例如data-bind="click: function () { $parent.doSomething(); }

标签: knockout.js typescript


【解决方案1】:

可能 B 类未初始化。确保class B 包含在之后 class A 例如检查脚本标签中的顺序,或者如果使用--out,请检查reference.ts中的顺序

【讨论】:

  • 排序看起来不错。如果我从 B 类中删除 GetSomeNumber 函数,它就可以工作。
【解决方案2】:

B 类上的 GetSomeNumber 函数实际上是在 B 类成员之一上调用 GetSomeNumber。此时成员属性尚未初始化。我的B班更像这样……

export class B extends A{
   somethingElse: C

   constructor(something: C){
       this.somethingElse = something; 
   }

   GetSomeNumber(): number { return this.somethingElse.GetSomeNumber(); }
}

为了解决这个问题,我现在检查 somethingElse 是否已初始化...

export class B extends A{
   somethingElse: C

   constructor(something: C){
       this.somethingElse = something; 
   }

   GetSomeNumber(): number { 
      if(this.somethingElse)
         return this.somethingElse.GetSomeNumber(); 
      else
         return 0;
   }
}

混淆的原因是C类的函数与B类的函数同名,所以我误解了错误信息。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 2019-03-31
    • 2012-10-21
    • 1970-01-01
    • 2018-10-15
    • 2018-05-26
    • 2012-06-06
    • 2015-06-02
    相关资源
    最近更新 更多