2016-10-13 3 views
0

У меня возникли проблемы с пониманием изменения «этой» ссылки в моем коде. Итак, есть три вещи, которые я не получаю:SAPUI5 - Проблемы с объемом «этого». ссылка на объект

1) Когда я пытаюсь получить мою модель в функции init (array1 в строке 10), я получаю «не могу прочитать свойство« getProperty »неопределенного». Но я могу получить доступ к модели моего представления в представлении xml, так как я определил модель в своем manifest.json и использую манифест в своем приложении Component. Почему я не могу получить доступ к модели в контроллере через this.getView(). GetModel?

2) В моем методе onDetailRouteHit я могу получить модель отлично с this.getView(). GetModel - (array2).

3) Когда я вызываю метод _Test(), я получаю сообщение «не могу прочитать свойство getProperty« неопределенной »ошибки снова (array3).

Так почему я не могу получить доступ к модели в init, но в onDetailRouteHit. И почему я не могу получить доступ к нему в onDetailRouteHit, но не в функции, которую я вызываю после этого? Я привык к Java, где это ссылается на текущий объект, что я предполагаю быть контроллером, который я сейчас использую в моем примере. Существуют ли «правила» этой области действия в javascript/UI5?

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

Если 'this' была различной во всех трех методах, тогда ваша ошибка msg, вероятно, была бы чем-то вроде 'can not read property 'getView''. Таким образом, я предполагаю, что это связано со временем. – Marc

+0

Если это связано с синхронизацией, не должна ли последняя ссылка на модель в массиве 3 работать, так как она уже загружена раньше в array2? – manban

+0

Да, он должен работать, и он работает в моем приложении (протестировал его прямо сейчас ..такая же проблема с onInit, другие звонки работали) ... – Marc

ответ

0

выезд this post. Он объясняет этим.

Таким образом, в основном это может иметь другое значение, основанное на вашем объекте и сфере применения.

Теперь на 3 функции.

  • в OnInit, ваш взгляд не был создан экземпляр еще, так this.getView() возвращает нуль

в вашей второй встретил взгляд был экземпляр, и это прямая ссылка на геймпаде , Следовательно, он получает объект возврата, который является вашим видом, потому что ваш контроллер может получить доступ к его представлению.

Ваш последний случай удивляет меня, потому что я ожидал, что эта функция сможет попасть в представление. Если он не должен сравнивать «этот» объект в отладчике и посмотреть, что это за ссылка.

+1

Спасибо! Я нашел здесь нечто похожее: https://github.com/SAP/openui5/issues/790 – manban

0

this.getView().getModel("myData") возвращает undefined в onInit потому, что представление не связано с родителем в этот момент. Взгляните на this graphic из документации. В нем написано:

Выполняется функция запуска контроллера -> Маршрутизатор размещает представления в корневом управлении: теперь модели доступны в представлении и его контроллере.

Если вы хотите получить доступ к модели в OnInit из высшей иерархии (например, модели компонентов), вам необходимо получить ссылку этого владельца модели в явном виде и затем вызвать getModel из него: this.getOwnerComponent().getModel("myData")

 Смежные вопросы

  • Нет связанных вопросов^_^