SAP UI5问题,渲染在自定义控件中调用两次

时间:2014-12-08 13:55:23

标签: sap sapui5

在视图中

var oData = {
        "SavedSearch" : [
            {   name : "Save1" },
            {   name : "Save2" },
            {   name : "Save3" },
            {   name : "Save4" },
            {   name : "Save5" }
        ]
    }
    var oModel = new sap.ui.model.json.JSONModel();
    oModel.setData(oData);
    sap.ui.getCore().setModel(oModel,"ModelData");
    var oTest = new test({
        manageSavedSearch :{
                path    : "ModelData>/SavedSearch",
                template: new sap.ui.commons.Button({
                    text : "{ModelData>name}"
                })
        },
    });
    oTest.placeAt(this);

在自定义控件

sap.ui.core.Control.extend("test",{
metadata:{
    properties : {},
    aggregations:{      
        manageSavedSearch   :   {type : "sap.ui.commons.Button", multiple :true },
        layout              :   {type : "sap.ui.layout.VerticalLayout", multiple :false }
    }
},
init : function(){
},
renderer : {
    render : function(oRm, oControl) {
  // Come two Times  Here
        var manageSavedSearch = oControl.getManageSavedSearch();
        var oSavedButtonHLyt = new sap.ui.layout.VerticalLayout();
        for(var index = 0 ; index < manageSavedSearch.length ; index++){
            oSavedButtonHLyt.addContent(manageSavedSearch[index]);
        }
        oControl.setAggregation("layout",oSavedButtonHLyt);
       oRm.renderControl(oControl.getAggregation("layout"));
    }
  }
},
onAfterRendering: function(){}
});

如果我不使用任何布局,则它不会在渲染中出现两次,否则它会在渲染中出现两次。这个问题发生在version 1.24.4。我可以在这里得到任何指导。

2 个答案:

答案 0 :(得分:2)

更改聚合(例如add / remove / insert / set / removeAll)使控件无效。在渲染过程中,永远不应使控件无效。在你的情况下,它可能是一个无限循环。

要调试渲染失效,有一个url参数test.html?sap-ui-xx-debugRendering = true然后您可以看到渲染堆栈跟踪以及谁负责渲染。

在您的代码示例中,有两个聚合更新。 setAggregation和addContent。 聚合变体使用第3个参数来抑制失效。因此,下面将插入聚合但是抑制失效,因为整个控件将在最后呈现,这不会是一个问题。

oControl.setAggregation("layout",oSavedButtonHLyt, true); // suppress invalidate

我猜你认为同样适用于addContent

oSavedButtonHLyt.addAggregation("content", manageSavedSearch[index], true);

但它并不是因为这里是manageSavedSearch [index],所以你的模板克隆的父级最初是oTest,但你是用addAggregation更改父级,因为layout将是父级。但是UI5无法自动确定前一个父级的抑制,因为它的聚合将被移动到其他地方。我们一起去

oControl.removeAggregation("manageSavedSearch", manageSavedSearch[index], true);
oSavedButtonHLyt.addAggregation("content", manageSavedSearch[index], true);

这是jsbin http://jsbin.com/rezayebada/1/edit?js,output

BTW,正如您所提到的,这只是一个示例不要将其作为构建复合控件的参考。

基本上,如果控件不覆盖其mutator方法,则属性/聚合/关联更改会使控件无效。我发现很难理解什么时候失效但是sap-ui-xx-debugRendering = true可以帮助你理解堆栈跟踪。

答案 1 :(得分:0)

我也面临这个问题,你可以尝试使用本地资源做一件事  而不是在线资源。