OData V2 SetProperty in onInit



我需要在onInit期间将属性设置为DataSet,以改变视图中一些控件的可见性。我可以通过在控制器中动态设置可见性来解决这个问题。但是我想使用表达式绑定和View中的visible属性来设置可见性。

我在函数onstartsetvisibility中得到一个错误。self.getView(). getbindingcontext()返回UNDEFINED。没有sPath,我就不能使用setProperty。如果没有setProperty,我的View-Controls就不知道visible-value

如何解决这个问题?

视图:

<uxap:ObjectPageSubSection visible="{= ${Responsible} === '1'}" id="leader">

</uxap:ObjectPageSubSection>

OnInit in View-Controller:

onInit: function () {
var startupParameters = this.getOwnerComponent().getComponentData().startupParameters;
var sWorkitem = startupParameters.TASK[0];
this.setModel(this.getOwnerComponent().getModel());
this.getModel().metadataLoaded().then(function () {
var sObjectPath = this.getModel().createKey("DataSet", {  
Workitem: sWorkitem 
});
this.getView().bindElement({
path: "/" + sObjectPath
});
}.bind(this));
var self = this;
var model = this.getOwnerComponent().getModel();
this.getModel().read("/CharSet", {
success: function (response) {
$.sap.Chars = response.results;
self.onStartSetVisibilities(model, self);
}
});
// self.getView().attachAfterRendering(function () {
//  self.onStartSetVisibilities(model, self);
// });

}

OnStartSetVisibilities:

onStartSetVisibilities: function (model, self) {
var char = model.getProperty(„GeneralData/Char");
if (char !== "" || char !== null) {
model.setProperty(self.getView().getBindingContext().sPath + "/Responsible", 
this.getResponsibleForChar(char));
}
}

我把一些代码放在一起,可能会解决你的问题(它未经测试,所以它可能包含语法错误!)。

我引入了Promises的概念,它简化了JS的异步行为。我还用Arrow函数替换了一些内部函数这样你就不用处理thatself了。箭头函数基本上使用它们所定义的作用域的this

你的应用程序现在应该有一个合适的流程。

  1. 首先绑定视图。
  2. 视图绑定后,读取CharSet
  3. 读取数据后设置可见性
onInit: function () {
const startupParameters = this.getOwnerComponent().getComponentData().startupParameters;
const sWorkitem = startupParameters.TASK[0];

this._bindView(sWorkitem)
.then(() => this._readCharSet())
.then(() => this._setVisibilities())
},

_bindView: function (sWorkitem) {
return new Promise((resolve) => {
const oModel = this.getOwnerComponent().getModel();
oModel.metadataLoaded().then(() => {
const sPath = "/" + oModel.createKey("DataSet", {  
Workitem: sWorkitem 
});
this.getView().bindElement({
path: sPath,
events: {
change: resolve,
dataReceived: resolve
}
});
});
});
},

_readCharSet: function () {
return new Promise((resolve) => {
const oModel = this.getOwnerComponent().getModel();
oModel.read("/CharSet", {
success: resolve
});
});
},

_setVisibilities: function () {
const oModel = this.getOwnerComponent().getModel();
const sChar = oModel.getProperty("GeneralData/Char");
if (sChar) {
// ...
}
}

最新更新