“这个”的范围问题。对象引用:无法访问onInit中的模型

时间:2016-10-13 13:22:18

标签: javascript sapui5

我在解释代码中this引用的更改时遇到了问题。所以有三件事我没有得到:

  1. 当我尝试在onInit中获取模型时,我得到:

      

    “无法读取未定义的属性'getProperty'”。

    但我可以在XML视图中访问我的视图模型,因为我在 manifest.json 中定义了模型,并在我的app组件中使用了manifest。为什么我无法通过this.getView().getModel

  2. 访问控制器中的模型
  3. 在我的onDetailRouteHit方法中,我可以使用this.getView().getModel完美地模拟该模型。

  4. 当我调用_Test方法时,我再次收到此错误:

      

    “无法读取未定义的属性'getProperty'”

  5. 那么为什么我无法访问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");
        }
      });
    });
    

2 个答案:

答案 0 :(得分:0)

结帐this post。它解释了这个

所以基本上它可以根据你的对象和范围有不同的含义。

现在进入3个功能。

  • 在onInit中,您的视图尚未实例化,因此this.getView()返回null

在你的第二次见面视图已被实例化,这是你的控制器的直接链接。因此,它会获得一个返回对象,因为您的控制器可以访问它的视图。

你的最后一个案例让我感到惊讶,因为我希望该功能能够进入视图。如果它没有比较"这个"调试器中的对象,看看它的引用是什么。

答案 1 :(得分:0)

this.getView().getModel("myData")在onInit中返回undefined是因为此时该视图未与父关联。请查看文档中的this graphic。它说:

  

执行控制器的初始化功能 - >路由器将视图置于根控件中:模型现在可在视图及其控制器中使用。

如果要从更高层次(例如组件模型)访问onInit中的模型,则需要明确获取该模型所有者的引用,然后从中调用getModelthis.getOwnerComponent().getModel("myData")

More about model propagation