UIで使用しているいくつかの静的オブジェクトでサービスを設定しています。Angular2静的JSONオブジェクトの非同期データに関する問題
fetchRulesVariables()
fetchRuleVariables() {
let variables = [
{
name: 'Credit Funding Type',
id: 1,
multiple: false,
hasOperators: true,
availableOperators: this.fetchOperators('inResults'),
inputType: 'single',
placeholder: 'Select a funding type',
availableValues: this.fetchFundingInstraments()
}, {
name: 'Device Trust Score',
id: 2,
multiple: false,
hasOperators: true,
availableOperators: this.fetchOperators('gtltResults'),
inputType: 'text',
placeholder: 'Enter a value between 0 - 100',
availableValues: ''
}
]
return variables;
}
このオブジェクトは、availableOperators
とavailableValues
としてそれへのデータの別の配列を付加する他の機能を実行します。それらも静的なjsonオブジェクトです。
私のコンポーネントでは、lodash
を使用してこのデータをIDで取得しています。私のコンポーネントHTMLで
fetchVariableData(id, type) {
let data = [];
switch (type) {
case 'operators':
data = _.find(this.variables, {id}).availableOperators;
break;
}
return data;
}
、私は結果をフェッチするために私の機能を使用してngFor
を実行しています。
<li *ngFor="let x of fetchVariableData(1, 'operators')"></li>
ここでの問題は、私は信じているいくつかの非同期の問題に実行していますということです。これを実行すると、availableOperators
が定義されていないというエラーが表示されます。しかし、私の演算子を私のfetchVariableData()
関数にハードコードすると、うまく動作します。
準備ができていないときにavailableOperators
を使用しようとしているところで、この非同期の問題を処理するにはどうすればよいですか?
これはすべてスタティックJSON
で、HTTPコールはありません。
EDIT1
コンポーネントコード:
export class AddRuleComponent implements OnInit {
variables: any;
ngOnInit() {
this.loadVars();
this.renderAddRuleForm();
}
loadVars() {
this.outcomes = this._mserv.fetchOutcomeTypes();
this.variables = this._mserv.fetchRuleVariables();
}
fetchVariableData(id, type) {
let data: any;
switch (type) {
case 'operators':
data = _.find(this.variables, {
id
}).availableOperators;
break;
}
return data;
}
}
サービスコード:
fetchRuleVariables() {
let variables = [
{
name: 'Credit Funding Type',
id: 1,
multiple: false,
hasOperators: true,
availableOperators: this.fetchOperators('inResults'),
inputType: 'single',
placeholder: 'Select a funding type',
availableValues: this.fetchFundingInstraments()
}, {
name: 'Device Trust Score',
id: 2,
multiple: false,
hasOperators: true,
availableOperators: this.fetchOperators('gtltResults'),
inputType: 'text',
placeholder: 'Enter a value between 0 - 100',
availableValues: ''
}
]
return variables;
}
fetchOperators(type) {
let operators = [];
// Based on the set of operators we want
switch (type) {
// In Results
case 'inResults':
operators.push({
name: 'In List',
id: 1,
}, {
name: 'Not In List',
id: 2,
});
break;
// Greater than & Less than
case 'gtltResults':
operators.push({
name: 'Greater Than <',
id: 3,
}, {
name: 'Less Than >',
id: 4,
});
break;
// Is/is not
case 'isisnot':
operators.push({
name: 'Is',
id: 5,
}, {
name: 'Is Not',
id: 6,
});
break;
}
return operators;
}
HTMLコード:
値ピップe:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'values', pure: false })
export class ValuesPipe implements PipeTransform {
transform(value: any, args: any[] = null): any {
return Object.keys(value).map(key => value[key]);
}
}
すべての静的データと約束/観測値などを扱っていない場合は、非同期の問題ではありません。コンポーネントの残りのコードを投稿できますか? 別の場所で別の定義をしていない限り、ブロックスコープの変数を使用して 'let'キーワードで '変数'を定義しています。次に、別の方法(スコープの異なるブロックの外側)で、this.variablesを使用してアクセスしようとしています。これを動作させるには、コンポーネントのインスタンスプロパティとして設定する必要があります。 'let'で定義された変数は、元のスコープ(この場合はメソッド)の外側に存在しなくなります。 – diopside
@diopside Hm。したがって、let変数は私のサービスファイルで定義されています。私のコンポーネントでは、 'ngOnInit'内で' this.variables = this._mserv.fetchRuleVariables(); 'を実行しています。私のコンポーネントでは、' fetchVariableData() 'で述べたコードから' this.variables'にアクセスします。これでこれ以上はクリアされますか? – SBB
あなたの 'fetchOperators'実装は何ですか? –