2017-07-04 21 views
1

"@angular/cli": "1.0.2"angular version 4を使用しています。Angular-CLIプロジェクトでjQueryを使用する

なんらかの理由で、select areaにjqueryベースのプラグインを使用しなければならなかったのは、等価なプラグインが見つからないためでした。

これは私のコンポーネントは

declare var $ : any; 
//adding only necessary code 
export class SelectComponent implements OnInit { 

    constructor(private _ngZone: NgZone) {} 

    public rowData: any = []; 

    ngOnInit() { 
     $('img#example').selectAreas({ 
      minSize: [10, 10], 
      onChanged: this.debugQtyAreas, 
      width: 500, 
      areas: [{ 
       x: 10, 
       y: 20, 
       width: 60, 
       height: 100, 
      }] 
     }); 
    } 
    debugQtyAreas(event, id, areas) { 
     this.rowData = areas.map(function(obj) { 
      return { 
       left: obj.x, 
       top: obj.y, 
       id: obj.id 
      }; 
     }); 
    }; 
} 

どのように見えるかをいくつかの方法がこのように私のjqueryの事は、私が画像上の領域を選択することができる午前取り組んでいます。私は、配列rowDataへの割り当て/プッシュしてい

しかし、値がビューに

を更新していない私は、インターネット上で検索を試してみました。このソリューションは皆のためではなく、私のため

this._ngZone.run(() => { 
     //running code inside this 
}) 

しかし、私が働いてい

としてここでエラーを取得しています

未定義

のプロパティ「実行」を読み込めません

あなたが必要rowDataで起こって同じこと、私は

for(var i = 0; i < areas.length; i++){ 
    this.rowData.push({ 
     left: areas[i].x, 
     top: areas[i].y, 
     id: obj.id 
    }); 
} 

を次のようにマップからそれを割り当てるのではなく、データをプッシュしようとしたときには、プロパティを読み取ることができませんと言う未定義

+0

'NgZone'をインポートしましたか? – theblindprophet

+0

'@ angle/core 'からの' import {NgZone};これは?はい。 – Rakeschand

+0

フルコードを表示します。私は理由を知っていると信じている。 – theblindprophet

答えて

2

の「プッシュ」 this参照を永続化する場合は、参照によって関数を渡すときにbindを使用してください。

onChanged: this.debugQtyAreas.bind(this) 

あなたは活字体でインライン関数を足すいるfunction接頭辞を使用しないでください。 =>表記を使用すると、thisの参照は既定で保持されます。

this.rowData = areas.map((obj) => { 
     return { 
      left: obj.x, 
      top: obj.y, 
      id: obj.id 
     }; 
    });  
+0

このスコープの問題。役に立ったありがとう。 – Rakeschand

+0

jqueryを注入した後に自動リロードが機能しなくなった理由を教えてください。それが働く前に – Rakeschand

+0

@Rakeschand ChangeDetectorRefを注入し、何かをjQueryコールバックから変更した後にdetectChanges()を呼び出してみてください。 ngZone.runの内部からそのメソッドを呼び出す必要があるかもしれません。私はあなたが解決策の一部を持っていたと思います。 ngZone.runは、ゾーンが更新されたときにコードを実行できるだけの誤解を招きます。 – cgTag

1

thisjQuery関数内に予約され、それは、通常、グローバルスコープに参照されていないとなります。

私はいつも私の関数の先頭にこの行を追加します。

let scope = this;

そして代わりthis`、例えばのscopeを使用します

scope._ngZone.run(() => { 
    //running code inside this 
}) 

... 

for(var i = 0; i < areas.length; i++){ 
    scope.rowData.push({ 
     left: areas[i].x, 
     top: areas[i].y, 
     id: obj.id 
    }); 
} 
+0

ありがとうございました。それはとても役に立ちます。 – Rakeschand

関連する問題