Запрос изменений пользовательской истории в Rally

Я хотел бы получить объект JSON для журнала изменений, используя URL-адрес, связанный с пользовательской историей. Я выполнил это с помощью jQuery, используя следующий код, хотя я бы предпочел сделать это с помощью встроенных инструментов в Rally SDK. Мне не повезло с запросами Ext.Ajax или Ext.data.JsonP, хотя я считаю, что это правильный подход. Любая помощь будет оценена по достоинству.

$.ajax({
    url: URL,
    dataType: 'jsonp',
    jsonp: 'jsonp',
    success: function(response) {
        $.each(response.RevisionHistory.Revisions, function(key, rev) {
            //Parse Revision Log
        });
    }
});

person Conner Reeves    schedule 02.10.2012    source источник


Ответы (1)


Это относительно просто с App SDK 2.0. Следующие примеры в документации должны быть вам полезны:

http://developer.rallydev.com/apps/2.0p4/doc/#!/guide/appsdk_20_data_models

http://developer.rallydev.com/apps/2.0p4/doc/#!/guide/appsdk_20_data_stores

Вот небольшой фрагмент кода, чтобы получить историю изменений конкретной истории:

Rally.data.ModelFactory.getModel({
    type: 'UserStory',
    success: function(storyModel) {
        var storyRef = 'https://rally1.rallydev.com/slm/webservice/1.37/hierarchicalrequirement/12345.js';
        var storyID = Rally.util.Ref.getOidFromRef(storyRef);
        storyModel.load(storyID, {
            fetch: ['Name', 'FormattedID', 'Description', 'RevisionHistory', 'Revisions'],
            callback: function(story, operation) {
                if(story && story.get('RevisionHistory') && story.get('RevisionHistory').Revisions) {
                    Ext.Array.each(story.get('RevisionHistory').Revisions, function(revision) {
                        //Parse revision log
                    });
                }
            }
        });
    }
});

Преимущество использования SDK заключается в том, что он автоматически выполняет запросы ajax и jsonp в зависимости от того, как вы запускаете приложение. Приведенный выше пример отлично подходит для одной истории. Если вы хотите проанализировать несколько историй, вы хотите использовать хранилище вместо model.load:

Ext.create('Rally.data.WsapiDataStore', {
    model: 'UserStory',
    autoLoad: true,
    fetch: ['Name', 'FormattedID', 'Description', 'RevisionHistory', 'Revisions'],    
    listeners: {
        load: function(store, stories) {
            Ext.Array.each(stories, function(story) { 
                if(story && story.get('RevisionHistory') && story.get('RevisionHistory').Revisions) {
                    Ext.Array.each(story.get('RevisionHistory').Revisions, function(revision) {
                        //Parse revision log
                    });
                }
            });
        }
    } 
});
person Kyle Morse    schedule 02.10.2012
comment
Мне нужен подход DataStore, хотя story.RevisionHistory.Revisions никогда не существовало. Самое близкое, что у меня есть, это story.data.RevisionHistory, который, как я вижу в FireBug, имеет свойства: _rallyAPIMajor, _rallyAPIMinor, _ref и _type. Использование поля _ref возвращает меня к тому, с чего я начал. Нужно ли мне что-то добавить в запрос, чтобы получить story.RevisionHistory.Revisions? - person Conner Reeves; 03.10.2012
comment
Вроде ответил на свой вопрос. Нужно добавить строку выборки из первого запроса во второй ;) Как всегда, спасибо за помощь, Кайл! - person Conner Reeves; 03.10.2012
comment
Ой! Хороший улов. Я обновил второй пример кода, чтобы он был правильным. - person Kyle Morse; 03.10.2012
comment
Еще одно исправление: story.RevisionHistory должно быть story.get('RevisionHistory') или story.data.RevisionHistory. - person Conner Reeves; 04.10.2012