Data binding UI5-在数据加载到模型之前,控件格式化程序执行得太快
我有一个web应用程序,它在登录后显示登录屏幕,左侧有导航窗格。此外,在onInit事件期间,我调用getUserData(),它收集有关用户的其他数据(例如角色并将它们保存到模型中)。 此导航类型为sap.tnt.NavigationListItem,并从模型中加载(数据在App.controller.js中硬编码)。在App.view.xml中,它如下所示Data binding UI5-在数据加载到模型之前,控件格式化程序执行得太快,data-binding,sapui5,lifecycle,Data Binding,Sapui5,Lifecycle,我有一个web应用程序,它在登录后显示登录屏幕,左侧有导航窗格。此外,在onInit事件期间,我调用getUserData(),它收集有关用户的其他数据(例如角色并将它们保存到模型中)。 此导航类型为sap.tnt.NavigationListItem,并从模型中加载(数据在App.controller.js中硬编码)。在App.view.xml中,它如下所示 <tnt:NavigationListItem text="{appView>title}" items="{path:
<tnt:NavigationListItem text="{appView>title}"
items="{path: 'appView>items', templateShareable: true}"
visible="{path: 'appView>neededRole', formatter:'.myFormatter'}">
问题是,当myFormatter函数运行时,getUserData()还没有完成,并且模型还没有包含用户必需的角色数组——因此,所有菜单项都是隐藏的。我需要实现的是确保MyFormatter仅在getUserData()完成后运行(虽然MyFormatter将重复运行,但getUserData只能运行一次)。我怎样才能做到呢?getUserData()是异步的,无论我将其放入onInit还是在渲染之前,它都只有在myFormatter从模型中收集到空数组后才能完成
非常感谢,当视图初始化时,格式化程序将首先运行,这是生命周期的一部分。 然后,每次显式(通过model.setProperty)修改“needRole”条目时,它都会运行 在您的代码中,似乎格式化程序实际使用了模型中的另一个数据:“角色” 因此,您可以将格式化程序绑定到两个模型条目,如下所示:
<tnt:NavigationListItem
text="{appView>title}"
items="{
path: 'appView>items',
templateShareable: true
}"
visible="{
parts: ['appView>neededRole', 'appView>/userData/roles'],
formatter:'.myFormatter'
}">
然后,当在模型中修改一个或多个角色时,将触发格式化程序
作为旁注:格式化程序是用来格式化数据,而不是计算东西的。更好的选择是直接在模型中创建一个“entryVisible”条目,然后将其绑定到NavigationListItem上(我知道格式化程序可以完成这项工作,但它们也会触发许多您不需要的重新加载)谢谢,这真的很有帮助!顺便说一句,如果有其他人在读这篇文章,还有一个问题我被困了一个小时-parts数组只接受模型中的字符串,你不能在那里使用硬编码字符串,比如'just-some-value'可能是
<tnt:NavigationListItem
text="{appView>title}"
items="{
path: 'appView>items',
templateShareable: true
}"
visible="{
parts: ['appView>neededRole', 'appView>/userData/roles'],
formatter:'.myFormatter'
}">
myFormatter: function(role, roles) {
return (roles || []).some(x => x.roleId === role);
}