如何推迟触发格式化程序

时间:2018-12-16 07:56:47

标签: sapui5

我的一个表没有加载数据,并且对其中一个未定义的OData模型抛出了一些错误。

<script id="sap-ui-bootstrap"
  src="/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.m, sap.uxap, sap.ui.table"
  data-sap-ui-theme="sap_bluecrystal"
  data-sap-ui-compatVersion="edge"
  data-sap-ui-preload="async"
  data-sap-ui-resourceroots='{"com.ABC": ""}'
  data-sap-ui-xx-bindingSyntax="complex"
></script>

Controller.js

_initializeData: function() {
  var parts = {};
  parts.PartsByKey = "SP";
  parts.PriceColumn = false;
  parts.SubTotalColumn = false;
  this.orderMaterialsModel = new JSONModel(Parts);
  this.getView().setModel(this.orderMaterialsModel, "orderParts"); //Line number 6
  this.orderMaterialsModel.setProperty("/OrdersTotal", 0);
  /* works fine till here. But moment above statement is executed,
  the execution goes to the below formatter. The model which is 
  initialized in the next line is never executed, and then the
  formatter throws error - model undefined */
  this.salesOrderModel = this.getOwnerComponent().getModel("salesOrderModel");
  this._validationChecks(this.salesOrderModel.getData());
  this.getView().getModel("salesOrderModel").refresh(false);
  //...
},

// Formatter function for the table rows
formatQty: function(QOH, qty) {
  var oType = this.salesOrderModel.oData.type;
  // error here as this.salesOrderModel does not exists..
},

1 个答案:

答案 0 :(得分:2)

设置/OrdersTotal值时,请异步进行:

this.orderMaterialsModel.setProperty("/OrdersTotal", 0, /*context*/null, /*async*/true );

说明

在视图定义中的某处,您必须将/OrdersTotalformatter: '.formatQty'绑定。最后调用setProperty而没有true会首先触发所有相关的侦听器(包括格式化程序),然后继续其余代码。

同步执行:

  1. _initializeData中:

    // ...
    this.orderMaterialsModel.setProperty("/OrdersTotal", 0);
    
  2. formatQty中:

    var oType = this.salesOrderModel.oData.type; // Error! this.salesOrderModel is undefined
    // ...
    
  3. 继续执行_initializeData

    this.salesOrderModel = this.getOwnerComponent().getModel("salesOrderModel");
    // ...
    

true作为setProperty API 中的第四个参数传递,将确保首先处理_initializeData中的其余代码行,然后所有相关的侦听器将作为最后一个要处理的任务放入调用堆栈中。

异步执行:

  1. _initializeData中:

    this.orderMaterialsModel.setProperty("/OrdersTotal", 0, null, true);
    this.salesOrderModel = this.getOwnerComponent().getModel("salesOrderModel");
    //...
    
  2. formatQty中:

    var oType = this.salesOrderModel.oData.type;
    // ...
    

另一个问题是,仅在设置模型后,侦听器(例如格式化程序)也会被触发。

您可以通过在调用堆栈的末尾设置模型来延迟触发器,就像使用异步setProperty一样,使用requestAnimationFrame

// ...
window.requestAnimationFrame(function() {
  this.getView().setModel(this.orderMaterialsModel, "orderParts");
  // triggers the formatter
}.bind(this));
// ...
相关问题