Sapui5 SAP UI5问题,在自定义控件中呈现调用两次

Sapui5 SAP UI5问题,在自定义控件中呈现调用两次,sapui5,Sapui5,鉴于 在自定义控件中 var oData = { "SavedSearch" : [ { name : "Save1" }, { name : "Save2" }, { name : "Save3" }, { name : "Save4" }, { name : "Save5" } ] } var oModel

鉴于

在自定义控件中

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(“测试”{
元数据:{
属性:{},
聚合:{
manageSavedSearch:{type:“sap.ui.commons.Button”,multiple:true},
布局:{type:“sap.ui.layout.VerticalLayout”,多个:false}
}
},
init:function(){
},
渲染器:{
呈现:函数(oRm、oControl){
//来这里两次
var manageSavedSearch=oControl.getManageSavedSearch();
var oSavedButtonHLyt=new sap.ui.layout.VerticalLayout();
对于(var index=0;index
如果我不使用任何布局,那么它不会在渲染中出现两次,否则它会在渲染中出现两次。此问题发生在
版本1.24.4
中。请给我一些指导

更改聚合(例如添加/删除/插入/设置/删除所有)会使控件无效。在渲染期间,决不应使控件无效。在您的例子中,它可以是一个无限循环

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

在您的代码示例中,有两个聚合更新。设置聚合和添加内容。 聚合变异器使用第三个参数来抑制无效。因此,下面将插入聚合,但抑制无效,因为最终将呈现整个控件,这不会是问题

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(){}
});
我猜你认为同样的方法也适用于addContent

oControl.setAggregation("layout",oSavedButtonHLyt, true); // suppress invalidate
但这并不是因为此处manageSavedSearch[index],所以模板克隆的父级最初是oTest,而是您正在使用addAggregation更改父级,因为layout将是父级。但UI5无法自动确定前一个父级的抑制,因为其聚合将移动到其他位置。所以我们一起去

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

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


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

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

感谢您的回复,但即使我们在
init
方法中设置聚合,它也会起作用,并且工作方式相同(在render中出现两次)布局聚合的倍数为
false
。当然setAggregation也会在init上失效,但在渲染期间不使控件失效的一点是保护无限的renderinginvalidate循环。set/add/remove/insertAggregation有第三个布尔参数用于抑制失效。但是您应该在下一次渲染时使用生成的布局。此外,布局似乎可能是一个隐藏的聚合。实际上,您不需要将布局作为聚合,您可以将其保留为本地引用,因为它与绑定传播无关。这只是一个示例。我的问题是为什么会有两次。以及我如何解决这个问题。我已经解释过了。渲染期间不应使控件无效。也许jsbin将有助于解释更多内容,因此请参见我编辑的答案。您添加了代码很好,但您能否简要解释一下您到底想要实现什么以及错误/意外行为?@Breakpoint-无论何时使用
版本1.24.4
中的任何布局控件,它都会在渲染中出现两次。这只是一个简单的例子。我的问题是为什么会有两次。以及我如何解决这个问题。我正在使用升级到
版本1.24.4
oControl.removeAggregation("manageSavedSearch", manageSavedSearch[index], true);
oSavedButtonHLyt.addAggregation("content", manageSavedSearch[index], true);