我在解释代码中this
引用的更改时遇到了问题。所以有三件事我没有得到:
当我尝试在onInit
中获取模型时,我得到:
“无法读取未定义的属性'getProperty'”。
但我可以在XML视图中访问我的视图模型,因为我在 manifest.json 中定义了模型,并在我的app组件中使用了manifest。为什么我无法通过this.getView().getModel
?
在我的onDetailRouteHit
方法中,我可以使用this.getView().getModel
完美地模拟该模型。
当我调用_Test
方法时,我再次收到此错误:
“无法读取未定义的属性'getProperty'”
那么为什么我无法访问onInit
中的模型,而是访问onDetailRouteHit
?为什么我可以在onDetailRouteHit
中访问它,但不能在之后调用的函数中访问它?我已经习惯了Java,其中this
引用当前对象,我认为它是我目前在我的例子中的控制器。
JS / UI5中是否存在this
范围的“规则”?
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function(Controller) {
"use strict";
return Controller.extend("test.controller.Detail", {
onInit: function() {
var array1 = this.getView().getModel("myData").getProperty("/myDataSet");
this.oRouter = this.getOwnerComponent().getRouter();
this.oRouter.getRoute("detail").attachPatternMatched(this._onDetailRouteHit.bind(this));
},
_onDetailRouteHit: function(oEvent) {
var array2 = this.getView().getModel("myData").getProperty("/myDataSet");
this._Test();
},
_Test: function() {
var array3 = this.getView().getModel("myData").getProperty("/myDataSet");
}
});
});
答案 0 :(得分:0)
结帐this post。它解释了这个。
所以基本上它可以根据你的对象和范围有不同的含义。
现在进入3个功能。
在你的第二次见面视图已被实例化,这是你的控制器的直接链接。因此,它会获得一个返回对象,因为您的控制器可以访问它的视图。
你的最后一个案例让我感到惊讶,因为我希望该功能能够进入视图。如果它没有比较"这个"调试器中的对象,看看它的引用是什么。
答案 1 :(得分:0)
this.getView().getModel("myData")
在onInit中返回undefined
是因为此时该视图未与父关联。请查看文档中的this graphic。它说:
执行控制器的初始化功能 - >路由器将视图置于根控件中:模型现在可在视图及其控制器中使用。
如果要从更高层次(例如组件模型)访问onInit中的模型,则需要明确获取该模型所有者的引用,然后从中调用getModel
:this.getOwnerComponent().getModel("myData")