Я пытаюсь создать страницу ралли, которая отображает пользовательские данные и позволяет мне экспортировать данные в Excel. Я боюсь, потому что я могу либо отображать данные в rallygrid (что позволяет мне вычислять пользовательские поля и отображать их), либо я могу отображать данные в rallygridboard (что позволяет мне экспортировать данные), но я не похоже, способны сделать то и другое.Ралли: использование пользовательских данных с TreeStoreBuilder и rallygridboard
У кого-нибудь есть идеи о том, что я могу сделать, чтобы сделать эту работу?
Пользовательские данные, которые я хочу отобразить, это имя инициатора родительской функции пользователя, fwiw.
Существует код в Rally's examples, который показывает, как отображать пользовательские данные в сетке. Я не вставит полный код здесь, чтобы сэкономить место, но вот отношение отрывок из их примера:
launch: function() {
Ext.create('Rally.data.wsapi.Store', {
model: 'userstory',
autoLoad: true,
listeners: {
load: this._onDataLoaded,
scope: this
},
fetch: ['FormattedID', 'Name', 'ScheduleState', 'Tasks', 'Defects']
});
},
_onDataLoaded: function(store, data) {
var records = _.map(data, function(record) {
//Perform custom actions with the data here
//Calculations, etc.
return Ext.apply({
TaskCount: record.get('Tasks').Count
}, record.getData());
});
this.add({
xtype: 'rallygrid',
showPagingToolbar: false,
showRowActionsColumn: false,
editable: false,
store: Ext.create('Rally.data.custom.Store', {
data: records
}),
....
Это прекрасно работает с rallygrid, но rallygrid не кажется для поддержки экспорта в csv.
Этот же подход (с использованием _onDataLoaded) не работает, когда я переключаю rallygrid на раллиградную доску. Я получаю сообщение об ошибке в _onDataLoaded в этой строке: var feature = record.get ('Feature'); Ошибка, которую я получаю: «record.get не является функцией»
Вот мой полный код. Обратите внимание, что это закодировано, чтобы получить нужные мне данные (это материал пользовательских сюжетов), а не Tasks (который был только примером примера ралли).
<!DOCTYPE html>
<html>
<head>
<title>Exportable Grid Board Example</title>
<script type="text/javascript" src="/apps/2.1/sdk.js"></script>
<script type="text/javascript">
var recordCount = 0;
Rally.onReady(function() {
Ext.define('Rally.example.ExportableGridBoard', {
extend: 'Rally.app.App',
componentCls: 'app',
launch: function() {
Ext.create('Rally.data.wsapi.TreeStoreBuilder').build({
models: ['portfolioitem/feature','userstory'],
autoLoad: true,
enableHierarchy: true,
listeners: {
load: this._onDataLoaded,
scope: this
}
}).then({
success: this._onStoreBuilt,
scope: this
});
},
_onDataLoaded: function (store, data) {
var records = _.map(data, function (record) {
//Perform custom actions with the data here
//Calculations, etc.
//console.log(record);
recordCount++;
var feature = record.get('Feature');
var featureName;
var initiative;
var initiativeName;
if (feature == null) {
featureName = '';
initiative = '';
initiativeName = '';
}
else {
featureName = feature.FormattedID + ' ' + feature.Name;
initiative = feature.Parent;
if (initiative == null) {
initiativeName = '';
}
else {
initiativeName = initiative.FormattedID + ' ' + initiative.Name;
}
}
return Ext.apply({
featureName: featureName,
initiativeName: initiativeName
}, record.getData());
})
},//_onDataLoaded
_onStoreBuilt: function(store) {
//this._onDataLoaded(store, store.data);
//console.log('num records: '+ recordCount);//seems to always be 0
var modelNames = ['userstory'],
context = this.getContext();
this.add({
xtype: 'rallygridboard',
context: context,
modelNames: modelNames,
toggleState: 'grid',
stateful: false,
plugins: [
{
ptype: 'rallygridboardactionsmenu',
menuItems: [
{
text: 'Export...',
handler: function() {
window.location = Rally.ui.gridboard.Export.buildCsvExportUrl(
this.down('rallygridboard').getGridOrBoard());
},
scope: this
}
],
buttonConfig: {
iconCls: 'icon-export'
}
}
],
gridConfig: {
store: store,
columnCfgs: [
'Name',
'ScheduleState',
//'c_AffinityEstimate',
'PlanEstimate',
'Project',
'Feature',
'Feature.Parent',
'featureName',
'initiativeName'
]
},
height: this.getHeight()
});
}
});
Rally.launchApp('Rally.example.ExportableGridBoard', {
name: 'Exportable Grid Board Example'
});
});
</script>
<style type="text/css">
</style>
</head>
<body></body>
</html>
В моем коде выше, у меня есть следующие: 'Функция', ' Feature.Parent', ' FeatureName', ' initiativeName' Это является излишним, но там для отладки. Feature.Parent не работает, и переменные, которые я вычисляю (featureName и InitName), не заполняются, потому что record.get() не работает. – sgeffner