我对SAP Open UI5中的attachRequestCompleted有疑问。
我的代码看起来像这样:
test : function (oEvent) {
model = new sap.ui.model.json.JSONModel();
// Load JSON in model
model.loadData("http://localhost:8080/getJSON");
model.attachRequestCompleted( function(){
console.log(model.getData());
this.makeSomething()
});
},
我想在模型加载后调用我的函数makeSomething,但这是不可能的。
我尝试在这样的函数之后调用它。调用该函数但未加载模型。
test : function (oEvent) {
model = new sap.ui.model.json.JSONModel();
// Load JSON in model
model.loadData("http://localhost:8080/getJSON");
model.attachRequestCompleted( function(){
console.log(model.getData());
}, this.checkElement());
},
这甚至可能吗?
答案 0 :(得分:1)
JavaScript中的 this 关键字非常棘手。正如W3schools所说here:
在JavaScript中,称之为的东西是"拥有的对象" JavaScript代码。
当在函数中使用时,它的值是"拥有的对象"功能。
当在对象中使用时,它的值是对象本身。
对象构造函数中的this关键字没有值。它只是新对象的替代品。
当构造函数用于创建对象时,this的值将成为新对象。
在您的情况下,如果您在测试方法中调用此,此将引用当前控制器。您可以在方法中使用 this 来访问控制器的其他方法。
但是,如果您在回调方法中使用此,则此 - 代码的所有者 - 不再是控制器。这是你的回调方法。 this.makeSomething()不存在。
通常的方法是创建一个通常称为 的变量,在此此时,您将此 的值赋予该值>具有您稍后要访问的值。然后您可以从回调方法访问它;在回调方法中,那个变量不会改变,而这个会有所不同。
代码示例胜过千言万语。请参阅下面的更改。
test : function (oEvent) {
var that = this;
model = new sap.ui.model.json.JSONModel();
// Load JSON in model
model.loadData("http://localhost:8080/getJSON");
model.attachRequestCompleted( function(){
console.log(model.getData());
that.makeSomething();
});
},
使用UI5时,我通常会创建一个与我的控制器方法相同级别的变量,名为 _globalThis 。在 onInit 方法中,然后我为其分配 this 的值,然后可以从我的每个回调方法中访问该变量。