【问题标题】:Data source query callback problems (call order, ability to change global variables)数据源查询回调问题(调用顺序、更改全局变量的能力)
【发布时间】:2011-11-04 17:03:31
【问题描述】:

我已将代码简化为以下简短示例。在其中,我想查询一组迭代,然后在回调中,循环遍历迭代并对资源求和。有一个全局变量,我想在其中存储总和......但我无法让它工作。

具体问题是查询(和相关的回调)在其他处理之后运行。

<html><!-- COMMENT -->

    <meta name="Name"    content="YOUR APP NAME HERE" /> 
    <meta name="Version" content="0.1" /> 
    <meta name="Vendor"  content="YOUR COMPANY NAME HERE" /> 

<!-- Rally SDK --> <script type="text/javascript" src="/apps/1.25/sdk.js"></script>

<!-- App script -->  <script> 

var rallyDataSource; var resourceSum = -1; 

function ProcessIterations(results) {
    alert("In ProcessIterations");  
    var resourceSum = 0; 
    for (iIter = 0; iIter < results.iterations.length; iIter++) {
      var iteration = results.iterations[iIter] ;
      resourceSum += iteration.Resources; 
    }
    alert("In ProcessIterations, resourceSum="+resourceSum);   }

function queryError () {
    alert("A query error occurred");   }

function runMainQuery() {   var today = dojo.date.stamp.toISOString(new Date(), {milliseconds: true, zulu: true});

  var queryObject = {
    key: "iterations",
    type: "Iteration",
    fetch: "Name,ObjectID,Resources,Project",
    order: "EndDate asc",
    query: "(Project.ObjectID != \"__PROJECT_OID__\")"
    };

  rallyDataSource.findAll(queryObject, ProcessIterations, queryError); }


function Main() {   rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__", "__PROJECT_OID__",
                "__PROJECT_SCOPING_UP__", "__PROJECT_SCOPING_DOWN__");

  runMainQuery() ;

  var tableConfig = {
      'columnKeys'   : ['planEst'],
      'columnHeaders': ['Plan Estimate']   };   var table = new rally.sdk.ui.Table(tableConfig);   table.setCell(0,0,resourceSum) ;   table.display("app_div");  

}

rally.addOnLoad(Main);

</script> <body>
    <div id="app_div"></div> 
    <div id="error_div"></div>  </body> </html>

【问题讨论】:

    标签: javascript web-services rally


    【解决方案1】:

    掌握异步回调的窍门可能有点棘手,但你真的很接近。 基本上,如果您只是在 ProcessIterations 回调中将表的创建从 Main 移到 up 上,您应该会很好:

    function ProcessIterations(results) {
        alert("In ProcessIterations");  
        var resourceSum = 0; 
        for (iIter = 0; iIter < results.iterations.length; iIter++) {
          var iteration = results.iterations[iIter] ;
          resourceSum += iteration.Resources; 
        }
        alert("In ProcessIterations, resourceSum="+resourceSum);   }
    
        var tableConfig = {
          'columnKeys'   : ['planEst'],
          'columnHeaders': ['Plan Estimate']   };   
          var table = new rally.sdk.ui.Table(tableConfig);   
          table.setCell(0,0,resourceSum) ;   
          table.display("app_div"); 
    }
    
    function Main() {   
        rallyDataSource = new rally.sdk.data.RallyDataSource("__WORKSPACE_OID__", "__PROJECT_OID__",
                "__PROJECT_SCOPING_UP__", "__PROJECT_SCOPING_DOWN__");
        runMainQuery() ;
    }
    

    这样,在您的 rallyDataSource.findAll 调用提供数据并且计算出您的 resourceSum 之前,您不会显示您的表格。

    作为附加资源,请查看我们帮助文档中有关使用 RallyDataSource 和异步回调的一些示例: http://developer.rallydev.com/help/rally-data-source

    【讨论】:

    • 我知道如果表渲染是从回调中发出的,那么一切正常。我实际上是故意以这种方式实现的,以听取/了解这些问题。查询。在我们特定的(更复杂的)案例中,我们实际上有一个初始查询(针对迭代/项目),在它的回调中我们做了两件事:添加表条目并发出另一个查询(针对迭代/项目中的故事)谁的回调创建了额外的表条目(所有计划估计的总和),在初始查询的结果集中每个条目一次。我们无法在两个嵌套查询中创建表条目。
    • 听起来您的回调正确地链接在一起。在添加所有数据之前等待调用 table.display() 可能会有所帮助...您也可以随时发布另一个问题,其中包含更完整的代码。
    猜你喜欢
    • 2015-06-25
    • 2017-12-10
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多