gpt4 book ai didi

JavaScript 对象丢失跨函数的引用

转载 作者:行者123 更新时间:2023-11-28 13:37:49 24 4
gpt4 key购买 nike

我正在使用一个小的待办事项列表应用程序测试 SAPUI5 框架。我有一个数据库并通过 REST 服务访问数据。我能够将所有内容放入我的 UI 中,并从 UI 放入数据库中。

但是,我将数据库数据的引用保存在 JSON 模型中,该模型映射到我在 UI 上显示的表。当我尝试添加/删除元素时,对数据库的写入似乎工作正常,但我的实习生模型变量在不同函数调用之间丢失了引用(例如“initToDoModel”和“addToDo”)。这是代码:

  sap.ui.controller("sapui5_test.SAPUI5_Test", {

//THIS IS THE REFFERENCE
todoModel : null,

addTodo : function(text) {
this.doAjax("/add", {
text : text
}).done(function(todo) {

//HERE todoModel IS UNDEFINED BUT WAS SET IN initTodoModel
this.todoModel.getProperty("/").push(todo);
this.todoModel.updateBindings();
this.getView().rerender();
});
},

initTodoModel : function() {

var oModel = new sap.ui.model.json.JSONModel();
var aData = jQuery.ajax({
type : "GET",
contentType : "application/json",
url : "http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/",
dataType : "json",
async: false,
success : function(data,textStatus, jqXHR) {

oModel.setData({modelData : data});

//HERE THE todoModel IS SET
this.todoModel = oModel;
alert("Ok");
}

});
return oModel;
},

doAjax : function(path, content, type, async) {
var params = {
url : "http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo" + path,
dataType : "json",
contentType : "application/json",
context : this,
//async : false,
cache : false
};

params["type"] = type || "POST";

if (async === false) {
params["async"] = async;
}

if (content) {
params["data"] = JSON.stringify(content);
}

return jQuery.ajax(params);
},

getTodo : function(id) {
var index, todo;

jQuery.each(this.todoModel.getProperty("/"), function(i, t) {
if (t.id === id) {
index = i;
todo = t;
}
});

return {
index : index,
todo : todo
};
}

});

因此每次加载页面时都会调用 initToDoModel 函数,从数据库获取数据,将其映射到 JSONModel 对象。然后,当我单击页面上的“添加”按钮时,将调用 addToDo 函数,并且需要更新此时未定义的缓存 JSONModel。

我是 JavaScript 新手,所以也许有人可以解释那里发生了什么。

最佳答案

您可以在 AJAX 回调中使用 console.log(this); - 您可能会看到它引用 window 对象。

您可以在 AJAX 调用之前将 this 所需的上下文存储在变量中,从而维护对当前对象的引用。

addTodo : function(text) {  
var that = this;
this.doAjax("/add", {
text : text
}).done(function(todo) {

//HERE todoModel IS UNDEFINED BUT WAS SET IN initTodoModel
that.todoModel.getProperty("/").push(todo);
that.todoModel.updateBindings();
that.getView().rerender();
});
},

关于JavaScript 对象丢失跨函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20149883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com