在视图中
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
。我可以在这里得到任何指导。
答案 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)
我也面临这个问题,你可以尝试使用本地资源做一件事 而不是在线资源。