如何获取Fiori应用中第二个模型的绑定上下文?
我来帮你分析下这个问题——你遇到的getBindingContext("localData")返回undefined的情况,其实是因为你的绑定方式导致的,咱们一步步拆解:
问题根源:绝对路径绑定不会生成绑定上下文
你在TextArea里用的是绝对路径绑定:{localData>/Text},这里的>/表示直接访问模型的根节点属性。这种绑定方式是直接指向模型的具体属性,不需要依赖绑定上下文(BindingContext),所以控件自然不会创建上下文对象,调用getBindingContext("localData")就会返回undefined。
BindingContext通常是在控件绑定到模型的某个相对路径时才会生成,比如列表项绑定到集合中的某个实体,或者控件/父容器设置了binding属性指向模型的某个节点,此时控件会基于这个节点形成上下文,后续可以用相对路径绑定子属性。
解决方案:两种方式获取数据或创建上下文
根据你的需求,有两种处理方式:
1. 直接获取值(不需要上下文)
如果你的目的只是拿到TextArea里的文本内容,完全不需要通过绑定上下文,直接从模型或者控件本身取值更简单:
onSendMail: function() { // 方式1:从命名模型中直接获取属性值 const oLocalModel = this.getView().getModel("localData"); const sText = oLocalModel.getProperty("/Text"); // 方式2:直接获取控件的当前值(适合用户修改后的内容) const sTextFromControl = this.byId("zgutMailFormText").getValue(); // 后续逻辑... }
2. 创建绑定上下文(如果需要相对路径绑定)
如果你确实需要绑定上下文(比如后续要给控件的其他属性用相对路径绑定),可以通过两种方式创建:
方式A:给父容器设置绑定路径(XML中实现)
给TextArea的父容器(比如VBox、Form等)设置binding属性指向模型根节点,然后TextArea用相对路径绑定:
<VBox binding="{localData>/}"> <TextArea id="zgutMailFormText" value="{localData>Text}" <!-- 去掉>/,使用相对路径 --> > <layoutData> <l:GridData span="XL2 L3 M3 S8" /> </layoutData> </TextArea> </VBox>
此时TextArea会继承父容器的绑定上下文,调用getBindingContext("localData")就能拿到上下文,再通过getProperty("Text")获取值。
方式B:在控制器中手动设置上下文
在onInit里给TextArea手动创建并设置绑定上下文:
onInit: function() { var oLocalModel = { Text: "test" }; var oModel = new JSONModel(oLocalModel); this.getView().setModel(oModel, "localData"); // 给TextArea创建并设置绑定上下文 const oTextArea = this.byId("zgutMailFormText"); const oContext = oModel.createBindingContext("/"); oTextArea.setBindingContext(oContext, "localData"); }
之后在onSendMail中就能正常获取上下文了:
onSendMail: function(oEvent) { var oLocalContext = this.byId("zgutMailFormText").getBindingContext("localData"); var sText = oLocalContext.getProperty("Text"); }
总结
简单来说,绝对路径绑定(带>/)不需要上下文,所以getBindingContext返回undefined。如果只是取值,直接从模型或控件获取更高效;如果需要上下文,就改成相对路径绑定并通过父容器或手动设置上下文。
内容的提问来源于stack exchange,提问作者tanto39

