Javascript 基于视图显示积压的自定义HTML页面
我正试图创建一个页面,显示基于特定条件的积压,但当我保存或更改视图时,它不会自动更新,我需要刷新页面,有人能帮我吗?我是rally应用程序开发新手 代码如下:Javascript 基于视图显示积压的自定义HTML页面,javascript,html,rally,Javascript,Html,Rally,我正试图创建一个页面,显示基于特定条件的积压,但当我保存或更改视图时,它不会自动更新,我需要刷新页面,有人能帮我吗?我是rally应用程序开发新手 代码如下: <!DOCTYPE html> <html> <head> <title>UserStory Defect List</title> <script type="text/javascript" src="https://rally1.rallydev.com/apps/
<!DOCTYPE html>
<html>
<head>
<title>UserStory Defect List</title>
<script type="text/javascript" src="https://rally1.rallydev.com/apps/2.1/sdk-debug.js"></script>
<script type="text/javascript">
Rally.onReady(function() {
Ext.define('UserStory.Defect.CustomizableColumnsGridBoard', {
extend: 'Rally.app.App',
componentCls: 'app',
launch: function() {
Ext.create('Rally.data.wsapi.TreeStoreBuilder').build({
models: ['defect', 'userstory'],
autoLoad: true,
enableHierarchy: true
}).then({
success: this._onStoreBuilt,
scope: this,
listeners: {
select: this._onSelect,
ready: this._onLoad,
scope: this
}
});
},
_onSelect: function() {
var grid = this.down('rallygridboardsharedviewcontrol'),
store = grid.getStore();
store.clearFilter(true);
store.filter(this._getStateFilter());
},
_onLoad: function() {
},
_onStoreBuilt: function(store) {
var modelNames = ['defect', 'userstory'],
context = this.getContext();
this.add({
xtype: 'rallygridboard',
context: context,
modelNames: modelNames,
toggleState: 'grid',
stateful: false,
plugins: [
'rallygridboardaddnew',
{
ptype: 'rallygridboardinlinefiltercontrol',
inlineFilterButtonConfig: {
stateful: true,
stateId: context.getScopedStateId('filters'),
modelNames: modelNames,
inlineFilterPanelConfig: {
quickFilterPanelConfig: {
defaultFields: [
'ArtifactSearch',
'Owner',
'ModelType',
'Tags'
],
addQuickFilterConfig: {
whiteListFields: ['Tags','Milestones']
}
},
advancedFilterPanelConfig:
{
advancedFilterRowsConfig: {
propertyFieldConfig: {
whiteListFields: ['Tags','Milestones']
}
}
}
}
}
},
{
ptype: 'rallygridboardfieldpicker',
headerPosition: 'left',
modelNames: modelNames,
stateful: true,
stateId: context.getScopedStateId('columns-example')
},
{
ptype: 'rallygridboardsharedviewcontrol',
sharedViewConfig: {
stateful: true,
stateId: context.getScopedStateId('custom-list-shared-view'),
enableUrlSharing: this.isFullPageApp !== false
}
},
{
ptype: 'rallygridboardactionsmenu',
menuItems: [
{
text: 'Export...',
handler: function() {
window.location = Rally.ui.gridboard.Export.buildCsvExportUrl(
this.down('rallygridboard').getGridOrBoard()
);
},
scope: this
}
],
buttonConfig: {
iconCls: 'icon-export'
}
},
'rallygridboardtoggleable'
],
cardBoardConfig: {
attribute: 'ScheduleState'
},
gridConfig: {
store: store,
columnCfgs: [
'Name',
'ScheduleState',
'State',
'Iteration',
'Release'
]
},
height: this.getHeight()-20
});
}
});
Rally.launchApp('UserStory.Defect.CustomizableColumnsGridBoard', {
name: 'UserStory Defect List'
});
});
rally.nLoad(function (){location.reload();});
</script>
<style type="text/css">
</style>
</head>
<body></body>
</html>
用户故事缺陷列表
onReady(函数(){
Ext.define('UserStory.Defect.CustomizelColumnsGridboard'{
扩展:“Rally.app.app”,
组件CLS:“应用程序”,
启动:函数(){
Ext.create('Rally.data.wsapi.TreeStoreBuilder').build({
模型:['defect','userstory'],
自动加载:对,
enableHierarchy:true
}).那么({
成功:这是一个成功的故事,
范围:本,,
听众:{
选择:此。\u选择,
准备好:这个。_onLoad,
范围:本
}
});
},
_onSelect:function(){
var grid=this.down('rallygridboardsharedviewcontrol'),
store=grid.getStore();
store.clearFilter(true);
store.filter(this.\u getStateFilter());
},
_onLoad:function(){
},
_OnStoreBuild:功能(存储){
var modelNames=['defect','userstory'],
context=this.getContext();
这个。添加({
xtype:“rallygridboard”,
上下文:上下文,
模型名:模型名,
toggleState:“网格”,
有状态:错误,
插件:[
“rallygridboardaddnew”,
{
p类型:“rallygridboardinlinefiltercontrol”,
inlineFilterButtonConfig:{
有状态的:是的,
stateId:context.getScopedStateId('filters'),
模型名:模型名,
inlineFilterPanelConfig:{
quickFilterPanelConfig:{
默认字段:[
“工件搜索”,
“所有者”,
“模型类型”,
“标签”
],
addQuickFilterConfig:{
whiteListFields:['Tags','Milestones']
}
},
高级过滤器面板配置:
{
advancedFilterRowsConfig:{
propertyFieldConfig:{
whiteListFields:['Tags','Milestones']
}
}
}
}
}
},
{
p类型:“rallygridboardfieldpicker”,
标题位置:“左”,
模型名:模型名,
有状态的:是的,
stateId:context.getScopedStateId('columns-example')
},
{
p类型:“rallygridboardsharedviewcontrol”,
sharedViewConfig:{
有状态的:是的,
stateId:context.getScopedStateId('custom-list-shared-view'),
EnableUrlShareing:this.isFullPageApp!==false
}
},
{
p类型:“rallygridboardactionsmenu”,
菜单项:[
{
文本:“导出…”,
处理程序:函数(){
window.location=Rally.ui.gridboard.Export.buildCsvExportUrl(
this.down('rallygridboard').getGridOrBoard()
);
},
范围:本
}
],
按钮图标:{
iconCls:“图标导出”
}
},
“RallyGridboardTogleable”
],
cardBoardConfig:{
属性:“ScheduleState”
},
gridConfig:{
店:店,,
专栏CFGS:[
“姓名”,
“计划状态”,
“国家”,
“迭代”,
“释放”
]
},
高度:this.getHeight()-20
});
}
});
Rally.launchApp('UserStory.Defect.CustomizelColumnsGridboard'{
名称:“UserStory缺陷列表”
});
});
nLoad(函数(){location.reload();});
我将代码更改为此,但视图不会保存过滤
<!DOCTYPE html>
<html>
<head>
<title>UserStory Defect List</title>
<script type="text/javascript" src="https://rally1.rallydev.com/apps/2.1/sdk-debug.js"></script>
<script type="text/javascript">
Rally.onReady(function () {
var Ext = window.Ext4 || window.Ext;
Ext.define('Rally.apps.backlog', {
extend: 'Rally.app.GridBoardApp',
alias: 'widget.backlogapp',
columnNames: ['FormattedID', 'Name', 'PlanEstimate', 'Priority', 'Owner'],
requires: [
'Rally.data.Ranker',
'Rally.data.wsapi.Filter',
'Rally.ui.gridboard.plugin.GridBoardInlineFilterControl',
'Rally.ui.gridboard.plugin.GridBoardSharedViewControl'
],
modelNames: ['hierarchicalrequirement', 'defect', 'defectsuite'],
statePrefix: 'backlog',
getAddNewConfig: function () {
var config = {};
if (this.getContext().isFeatureEnabled('S107862_TEAM_PLANNING_EXPANDED_BACKLOG_HOTNESS_PHASE_1')) {
config.margin = 0;
}
return _.merge(this.callParent(arguments), config);
},
getPermanentFilters: function (types) {
types = (types === undefined ? ['hierarchicalrequirement', 'defect', 'defectSuite'] : types);
var typeCriteria = [];
if (_.contains(types, 'defect')) {
typeCriteria.push(Rally.data.wsapi.Filter.and([
{ property: 'State', operator: '!=', value: 'Closed' },
{ property: 'TypeDefOid', operator: '=', value: this._getModelFor('defect').typeDefOid }
]));
}
if (_.contains(types, 'hierarchicalrequirement')) {
typeCriteria.push(Rally.data.wsapi.Filter.and([
{ property: 'DirectChildrenCount', operator: '=', value: 0 },
{ property: 'TypeDefOid', operator: '=', value: this._getModelFor('hierarchicalrequirement').typeDefOid }
]));
}
var defectSuiteModel = this._getModelFor('defectsuite');
return [
Rally.data.wsapi.Filter.and([
{ property: 'Release', operator: '=', value: null },
{ property: 'Iteration', operator: '=', value: null }
]),
Rally.data.wsapi.Filter.or(typeCriteria.concat(defectSuiteModel ? [{ property: 'TypeDefOid', operator: '=', value: defectSuiteModel.typeDefOid }] : []))
];
},
getGridConfig: function () {
return _.merge(this.callParent(arguments), {
inlineAddConfig: {
listeners: {
beforeeditorshow: function (addNewCmp, params) {
params.Iteration = 'u'; // explicitly set iteration to unscheduled so it doesn't default to current iteration on TPS editor.
}
}
}
});
},
getGridStoreConfig: function () {
return {
enableHierarchy: false
};
},
getGridBoardCustomFilterControlConfig: function () {
var context = this.getContext();
var blackListFields = ['Iteration', 'PortfolioItem', 'Release'];
var whiteListFields = ['Milestones', 'Tags'];
if (context.isFeatureEnabled('S107862_TEAM_PLANNING_EXPANDED_BACKLOG_HOTNESS_PHASE_1')) {
return {
ptype: 'rallygridboardinlinefiltercontrol',
inlineFilterButtonConfig: {
stateful: true,
stateId: context.getScopedStateId('backlog-inline-filter'),
filterChildren: true,
modelNames: this.modelNames,
inlineFilterPanelConfig: {
quickFilterPanelConfig: {
defaultFields: [
'ArtifactSearch',
'Owner',
'ModelType'
],
addQuickFilterConfig: {
blackListFields: blackListFields,
whiteListFields: whiteListFields
}
},
advancedFilterPanelConfig: {
advancedFilterRowsConfig: {
propertyFieldConfig: {
blackListFields: blackListFields,
whiteListFields: whiteListFields
}
}
}
}
}
};
}
return {
showOwnerFilter: false,
showIdFilter: true,
idFilterConfig: {
stateful: true,
stateId: this.getScopedStateId('backlog-id-filter'),
storeConfig: {
autoLoad: true,
pageSize: 25,
fetch: ['FormattedID', '_refObjectName'],
filters: this.getPermanentFilters()
}
}
};
},
getSharedViewConfig: function() {
var context = this.getContext();
if (true) {
return {
ptype: 'rallygridboardsharedviewcontrol',
sharedViewConfig: {
stateful: true,
stateId: context.getScopedStateId('backlog-shared-view'),
defaultViews: _.map(this._getDefaultViews(), function(view) {
Ext.apply(view, {
Value: Ext.JSON.encode(view.Value, true)
});
return view;
}, this),
enableUrlSharing: this.isFullPageApp !== false
},
enableGridEditing: context.isFeatureEnabled('S91174_ISP_SHARED_VIEWS_MAKE_PREFERENCE_NAMES_UPDATABLE')
};
}
return {};
},
_getDefaultViews: function() {
var rankColumnDataIndex = this.getContext().getWorkspace().WorkspaceConfiguration.DragDropRankingEnabled ? Rally.data.Ranker.RANK_FIELDS.DND : Rally.data.Ranker.RANK_FIELDS.MANUAL;
return [
{
Name: 'Default View',
identifier: 1,
Value: {
toggleState: 'grid',
columns: _.flatten([
{ dataIndex: rankColumnDataIndex },
_.map(this.columnNames, function(columnName) {
return { dataIndex: columnName }
})
]),
sorters:[{ property: rankColumnDataIndex, direction: 'ASC' }]
}
}
];
},
getGridBoardConfig: function () {
var config = this.callParent(arguments);
return _.merge(config, {
listeners: {
viewchange: function() {
this.loadGridBoard();
},
scope: this
}
});
},
_getModelFor: function(type) {
return _.find(this.models, { typePath: type });
},
onFilterTypesChange: function(types) {
this.gridboard.gridConfig.storeConfig.filters = this.getPermanentFilters(types);
}
});
Rally.launchApp('Rally.apps.backlog', {
name: 'UserStory Defect List'
});
});
</script>
<style type="text/css">
</style>
</head>
<body></body>
</html>
用户故事缺陷列表
Rally.onReady(函数(){
var Ext=window.Ext4 | | window.Ext;
Ext.define('Rally.apps.backlog'{
扩展:“Rally.app.GridBoardApp”,
别名:“widget.backlogapp”,
列名称:['FormattedID','Name','PlanEstimate','Priority','Owner'],
要求:[
“Rally.data.Ranker”,
'Rally.data.wsapi.Filter',
'Rally.ui.gridboard.plugin.GridBoardInlineFilterControl',
'Rally.ui.gridboard.plugin.GridBoardSharedViewControl'
],
模型名:['HierarchycalRequirement','defect','defectsuite'],
statePrefix:'积压',
getAddNewConfig:函数(){
var config={};
如果(this.getContext().isFeatureEnabled('S107862\团队\规划\扩展\待办事项\热度\阶段\ 1')){
config.margin=0;
}
return u.merge(this.callParent(arguments),config);
},
getPermanentFilters:函数(类型){
类型=(类型===未定义?['hierarchicalrequirement','defect','defectSuite']:类型);
var-typeCriteria=[];
if(u.contains(类型,'defect')){
typeCriteria.push(Rally.data.wsapi.Filter.and([
{属性:'State',运算符:'!=',值:'Closed'},
{属性:'TypeDefOid',运算符:'=',值:this.\u getModelFor('defect')。TypeDefOid}
]));
}
if(u.contains(类型,'hierarchycalrequirement')){
typeCriteria.push(Rally.data.wsapi.Filter.and([
{属性:'DirectChildrenCount',运算符:'=',值:0},
{属性:'TypeDefOid',运算符:'=',值:this.\u getModelFor('Hierarchy