2017-09-18 2 views
0

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; 
} 
+0

あなたがこれまで持っているコードを共有することはできますか?これを行うことはあまり難しいことではありません。ルックバックストアが読み込まれたら、データをループしてwsapiからユーザーを読み込むだけで済みます。あなたは既にそれをたくさん持っているようですが、すべての非同期コードを管理するための助けが必要かもしれません。 –

+0

こんにちはカイル、私は元のポストにコードを含めている。 – Lokesh

+0

@KyleMorse、解決策は見つかりましたか?アプリケーションのロード時にDeft.Promise.Allを含めることで、Active UsersとDisabled Usersをローカル変数にロードしようとしました。しかし、ユーザーはルックバックデータロードの完了後に読み込まれます。 – Lokesh

答えて

0

- はここにコードブロックです。こうすることで、すべてのデータが既に取得済みで、ルックバックスナップショットの処理中に直接ルックアップを実行できます。このような

何か:

Ext.define('CustomApp', { 
    extend: 'Rally.app.App', 
    componentCls: 'app', 
    launch: function() { 
     this._loadUsersFromWsapi().then({ 
      success: function (users) { 
       this.usersByOid = _.indexBy(users, function(user) { 
        return user.getId(); 
       }); 
       this._loadSnapshotData(); 
      }, 
      scope: this 
     }); 
    }, 

    _loadUsersFromWsapi: function() { 
     return Ext.create('Rally.data.wsapi.Store', { 
      model: 'user', 
      limit: Infinity, 
      pageSize: 2000, 
      fetch: ['ObjectID'] 
     }).load(); 
    }, 

    _loadSnapshotData: function() { 
     //Now in here for any given snapshot you can get the user 
     //information by looking it up in the this.usersByOid map 
     var userName = this._usersByOid[userObjectID].get('_refObjectName'); 
    } 
}); 
+0

あまりにもカイルありがとうございます。それは魅力のように働いた。しかし、それは私が必要としているすべてのユーザーデータを取得しているので、アプリケーションのパフォーマンスに影響を与えています。ルックバックでユーザー名を取得する他の方法はありますか?ユーザーフィールドを水和することはできませんが、必要なユーザー名をオブジェクトIDでフェッチするだけで、アプリケーションの最適なパフォーマンスが維持されます。 – Lokesh

+0

ルックバックを介して取得する方法はありません。あなたが行うことができるのは、Deft.Promise.allを使用してルックバックとユーザーの要求を並行して行い、そのコードを上記のように連続的に処理するのではなく、その成功ハンドラでデータをつなぎ直すことです^^ –

関連する問題