Lookback APIからデータを取得しているアプリがあります。私はデータ内でUser ObjectIDを取得しますが、ObjectIDの代わりにUserのDisplayNameを取得したいと思います。ラリールックバックAPIはユーザーフィールドのハイドレートを許可しないため、ルックバックAPIデータを読み込む際にユーザー名を使用することはできません。 ユーザーIDを取得するためにユーザーオブジェクトのフィルターを使用してストアを作成しようとしましたが、ルックバックAPIのデータ読み込みが完了するまで、ユーザーの名前を取得しません。 Lookback APIデータの読み込みが完了するまでに、データ操作も完了しました。したがって、最初の読み込み後にユーザー名を読み込むことは役に立ちません。私はStoreのasyncプロパティをfalse/trueに設定しようとしましたが、動作しませんでした。 Rally SDK 2.0でこれを実現する方法はありますか?私はおそらくちょうどWSAPIからアップフロントのすべてのユーザーをロードしたい物事を単純化し、OBJECTIDによってそれらのマップを構築するためにCA Agile Central(AKA Rally)カスタムアプリケーションでObjectIDを使用して単一のオブジェクトの詳細を取得する方法?
//Lookback call
_getStoriesByUser: function (user_story_ids, user_oids, user_story_state, users) {
this.acceptedByTM = [];
var scheduleStates = [];
scheduleStates.push('Accepted');
scheduleStates.push('Released to Prod');
var deferred = Ext.create('Deft.Deferred');
var me = this;
console.time("FetchingLBData");
var snapshotStore = Ext.create('Rally.data.lookback.SnapshotStore', {
"context": this.getContext().getDataContext(),
"fetch": ["ScheduleState", "_User", "_PreviousValues.ScheduleState"],
"hydrate": ["ScheduleState"],
"find": {
"ObjectID": { "$in": user_story_ids },
//"_User": { "$in": user_oids },
"_TypeHierarchy": "HierarchicalRequirement",
"ScheduleState": { "$in": scheduleStates },
"_PreviousValues.ScheduleState": { "$ne": null },
"Children": null
},
"sort": { "_ValidFrom": -1 }
});
snapshotStore.load({
callback: function (records, operation) {
if (operation.wasSuccessful()) {
console.timeEnd("FetchingLBData");
me.logger.log("LB US Count >>", records.length, records)
var total_us_accepted_by_tm = 0;
var tmAcceptedUS = 0;
var nontmAcceptedUS = 0;
var tm_accepted = [];
Ext.Array.each(user_story_state, function (uss) {
Ext.Array.each(records, function (rec) {
if ((rec.get('ObjectID') == uss.ObjectID && rec.get('ScheduleState') == 'Accepted') && (uss.ScheduleState == 'Accepted' || uss.ScheduleState == 'Released to Prod')) {
total_us_accepted_by_tm += 1;
tm_accepted.push({ ObjectID: rec.get('ObjectID'), UserObjectID: rec.get('_User') });
var userName;
//userName = me._fetchUserName(rec.get('_User')).value;
me._fetchUserName(rec.get('_User')).then({
success: function (records) {
userName = records[0].get('DisplayName')
},
failure: function (error) {
console.log('Error in Execution:', error)
}
}).always(function() {
console.log('Waiting for Update!');
});
//userName = rec.get('_User').DisplayName;
console.log('Accepted By Name: ', userName);
me.acceptedByTM.push({ ObjectID: rec.get('ObjectID'), UserObjectID: userName });
return false;
}
});
});
deferred.resolve(me.acceptedByTM);
} else {
deferred.reject('Problem querying lookback');
}
},
scope: me
});
return deferred;
},
//Get User Details for a given user
_fetchUserName: function (userObjId) {
var me = this;
var userName;
var userDetails;
var deferred = Ext.create('Deft.Deferred');
me.logger.log("Fetching User Information for User >>", userObjId);
var userFilter = Ext.create('Rally.data.wsapi.Filter', {
property: 'ObjectID',
value: userObjId
});
userDetails = Ext.create('Rally.data.wsapi.Store', {
model: 'User',
fetch: ['ObjectID', 'DisplayName'],
filters: userFilter,
limit: 1,
pageSize: 1
});
userDetails.load({
scope: this,
callback: function (records, operation, success) {
console.log("Operation Status: ", operation.synchronous);
if (success) {
//userName = records[0].get('DisplayName');
deferred.resolve(records);
} else {
deferred.reject(Ext.String.format("Error getting {0} count for {1}: {2}", 'User', userFilter.toString(), operation.error.errors.join(',')));
}
}
});
return deferred.promise;
}
あなたがこれまで持っているコードを共有することはできますか?これを行うことはあまり難しいことではありません。ルックバックストアが読み込まれたら、データをループしてwsapiからユーザーを読み込むだけで済みます。あなたは既にそれをたくさん持っているようですが、すべての非同期コードを管理するための助けが必要かもしれません。 –
こんにちはカイル、私は元のポストにコードを含めている。 – Lokesh
@KyleMorse、解決策は見つかりましたか?アプリケーションのロード時にDeft.Promise.Allを含めることで、Active UsersとDisabled Usersをローカル変数にロードしようとしました。しかし、ユーザーはルックバックデータロードの完了後に読み込まれます。 – Lokesh