2017-10-03 3 views
1

Ich muss eine Filterfunktion verwenden, um eine Heuristik für die Auswahl von Datensätzen zu implementieren. Einfache Feld-/Wertprüfungen allein reichen für unseren Zweck nicht aus.Wie aktiviere ich Filterfunktionen in CA Agile Central?

Ich versuche, den Beispielen für Funktionsfilter zu folgen, aber aus irgendeinem Grund wird das Flag "allowFunctions" immer auf false gesetzt.

ich versuche, die allowFunctions Eigenschaft auf true in der storeconfig zu setzen:

  storeConfig: { 
       models: ['userstory', 'defect'], 
       allowFunctions: true,     
       filters: [{ 
        // This did not work ... 
        property: 'Iteration.Name', 
        value: 'Sprint 3', 
        // Trying dynamic Filter Function. Update: Never called. 
        filterFn: function (item) { 
         console.log("Entered Filter Function!"); 
         var iter = item.get("Iteration"); 
         console.log("Iteration field: ", iter); 
         if (iter !== null && iter !== undefined) { 
          return (iter.name === "Sprint 3"); 
         } else { 
          return false; 
         } 
        } 
       }] 
      }, 

Nachdem die Rasteransicht macht, ich inspizieren sie die Speicherkonfiguration und seine Filter:

  listeners: { 
       afterrender: { 
        fn: function (_myVar, eOpts) { 
         console.log("Arg to afterrender: ", _myVar, " and ", eOpts); 
         var _myStore = _myVar.getStore(); 
         console.log("Store filters: ", _myStore.filters); 
        } 
       } 
      }, 

Was Ich finde, dass die Eigenschaft allowFunctions auf false zurückgesetzt wurde und ich sehe, dass die angegebene Filterfunktion nie ausgelöst wurde.

Console Screen Shot

Also entweder ich allowFunctions auf true an der falschen Stelle setze, oder gebaut etwas in die Rally der Grid-Ansicht und seinen Datenspeicher verbietet Filterfunktionen und dreht die Flagge zurück auf false gesetzt.

ODER es gibt eine dritte Möglichkeit zu verraten, wie schlecht von meiner Theorie der Operation ist.

Oh, weise Veteranen, bitte beraten.

Hier ist die gesamte Apps.js Datei:

Ext.define('CustomApp', { 
    extend: 'Rally.app.App', 
    componentCls: 'app', 
    launch: function() { 
     //Write app code here 
     console.log("Overall App Launch function entered"); 
     //API Docs: https://help.rallydev.com/apps/2.1/doc/ 
    } 
}); 

Rally.onReady(function() { 
    Ext.define('BOA.AdoptedWork.MultiArtifactGrid', { 
     extend: 'Rally.app.App', 
     componentCls: 'app', 

     launch: function() { 
      console.log("onReady Launch function entered"); 
      this.theGrid = { 
       xtype: 'rallygrid', 
       showPagingToolbar: true, 
       showRowActionsColumn: false, 
       editable: false, 
       columnCfgs: [ 
        'FormattedID', 
        'Name', 
        'ScheduleState', 
        'Iteration', 
        'Release', 
        'PlanEstimate', 
        'TaskEstimateTotal', 
        'TaskActualTotal', // For some reason this does not display ?? :o(?? 
        'TaskRemainingTotal' 
       ], 
       listeners: { 
        afterrender: { 
         fn: function (_myVar, eOpts) { 
          console.log("Arg to afterrender: ", _myVar, " and ", eOpts); 
          var _myStore = _myVar.getStore(); 
          console.log("Store filters: ", _myStore.filters); 
         } 
        } 
       }, 
       storeConfig: { 
        models: ['userstory', 'defect'], 
        allowFunctions: true,     
        filters: [{ 
         // This did not work ... 
         property: 'Iteration.Name', 
         value: 'Sprint 3', 
         // Trying dynamic Filter Function. Update: Never called. 
         filterFn: function (item) { 
          console.log("Entered Filter Function!"); 
          var iter = item.get("Iteration"); 
          console.log("Iteration field: ", iter); 
          if (iter !== null && iter !== undefined) { 
           return (iter.name === "Sprint 3"); 
          } else { 
           return false; 
          } 
         } 
        }] 
       }, 
       context: this.getContext(), 
       scope: this 
      }; 
      this.add(this.theGrid); 
      console.log("The Grid Object: ", this.theGrid); 
     } 
    }); 


    Rally.launchApp('BOA.AdoptedWork.MultiArtifactGrid', { 
     name: 'Multi-type Grid' 
    }); 
}); 

Antwort

1

Dies ist eine knifflige Frage, da Sie immer noch Ihre Server-Filter anwenden möchten und dann wollen Sie die Daten weiter filtern nach unten auf der Client-Seite .

Schauen Sie sich dieses Beispiel hier: https://github.com/RallyCommunity/CustomChart/blob/master/Settings.js#L98

Ich glaube, Sie im Grunde eine Last Zuhörer zu Ihrem Geschäft hinzufügen und dann innerhalb dieser Handler können Sie eine filterBy tun, um Ihre Ergebnisse auf der Client-Seite zu filtern.

listeners: { 
    load: function(store) { 
     store.filterBy(function(record) { 
      //return true to include record in store data 
     }); 
    } 
} 

Ich bin mit allowFunctions nicht vertraut, aber im Allgemeinen remoteFilter: true/false ist, was steuert, ob die Filter Server-Seite oder Client-Seite auftritt. remoteFilter: true + Der obige Last-Handler bietet Ihnen das Beste aus beiden Welten.

+0

Kyle, Mann, vielen Dank. Ja, der Grund dafür, dass die einfachen Wertanzeigen beibehalten werden sollen, besteht darin, die Ergebnismenge einzuschränken, auf die die Funktion angewendet wird. Ich habe Angst vor schrecklichen Leistung, wenn ich nur versuche, alle Filterung in der Funktion auf der Client-Seite zu tun. Es gibt wahrscheinlich 15 Jahre Daten in dieser Rally-Instanz. Ich weiß, dass der Projektkontext das natürlich sehr viel abschwächen wird, aber selbst Projekte haben viel Geschichte. Daher müssen Datumsbereiche und einfache Wertkriterien das Ergebnis so klein wie möglich machen. –

Verwandte Themen