Data binding UI5-在数据加载到模型之前,控件格式化程序执行得太快

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:

我有一个web应用程序,它在登录后显示登录屏幕,左侧有导航窗格。此外,在onInit事件期间,我调用getUserData(),它收集有关用户的其他数据(例如角色并将它们保存到模型中)。 此导航类型为sap.tnt.NavigationListItem,并从模型中加载(数据在App.controller.js中硬编码)。在App.view.xml中,它如下所示

<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);
}