2017-10-25 8 views
0

私はこの活字体:無関係なクラスのインスタンス機能を上書き

export class Item { 

    element:JQuery<HTMLElement> 

    constructor(...) { 
     this.element = $("<div >...</div>"); 
     ... 
     this._tooltipUpdate(); 
     this.element.tooltip({ 
      items: "div[data-tooltip]", 
      content: this.element.attr("data-tooltip"), 
      open: this._tooltipUpdate, 
      ... 
     }); 

    } 

    ... 

    public _tooltipUpdate =():void => { 
     this.element.attr(
      "data-tooltip", 
      `...` 
     ); 
    }; 

} 

のように構築Itemクラスは、基本的には、Itemクラスは、そのDOM要素を保持しているelement属性を持っています。

私は今InventoryElement

export class InventoryElement extends MenuElement { 

    amount:number; 

    constructor(item:Item) { 
     super(...) 

     this.amount = 0; 

     ... 

     this.item._tooltipUpdate =() => { 
      this.element.attr(
       "data-tooltip", 
       `${this.amount}` 
      ); 
     } 
    } 
} 

、別のクラスを持っているInventoryElementItemインスタンスは基本的に、異なる_tooltipUpdate機能を持つ必要があります。 現在、正しく上書きされていません。 私は、Item_tooltipUpdateが前に、このような実装

_tooltipUpdate() { 
    ... 
} 

を持っていたが、私はそれがプロトタイプの機能の代わりに、上記の矢印演算子でインスタンス機能として実装することをお読みください。

arrow機能を正しく使用していますか? Itemインスタンスの機能を変更するにはどうすればよいですか?ありがとう!

答えて

0

矢印機能を使用する場合は、InventoryElementという呼び出しインスタンスにthisをバインドします。

あなたはItemthis.elementを呼び出したい場合、あなたは一般的に、私はあなたがこれを行うような方法は、最善の方法だとは思わないbind関数定義

を参照してください

this.item._tooltipUpdate = function() { 
    // this is now bound to Item 
}.bind(this.item); 

を行う必要があります。 あなたの_tooltipUpdateは、ハンドラのようなもので、アイテム内の変更に対応できるようです。いくつかのイベントロジックを実装してリスナをアタッチする方が良いでしょう。

また、わかりましたが、ちょうど変化しているamountがあります。ですから、setAmountというItemの中にメソッドを持たないのはなぜですか?それははるかにクリーンで実装が簡単です。

+0

'amount'は' Item'には関連付けられませんが、 'InventoryElement'に関連付けられます。私は 'Item'のツールチップにまだそれを表示しようとしていましたが、それは可能ではないかもしれません。 – glitchroy

+0

私は知っています。しかし、Item.elementの属性として金額を設定しています。だから要素がそれに反応するとき、それをItemに関連付けるのはなぜですか? – Luke

+0

実際にはい、私はそれがより簡単になり、呼び出しコンテキストと関数バインディングなどで頭痛を回避すると思います。ありがとう! – glitchroy

関連する問題