JavaScript对象失去跨函数的引用
我正在用一个小的待办事项列表应用程序测试SAPUI5框架。我有一个数据库,并通过REST服务访问数据。我能够将所有内容都输入我的UI,并从UI输入数据库 但是,我将数据库数据的引用保存在一个JSON模型中,该模型映射到我在UI上显示的表中。当我尝试添加/删除元素时,对数据库的写入似乎工作正常,但我的intern模型变量在不同的函数调用之间失去了引用(“initToDoModel”和“addToDo”就是一个例子)。代码如下:JavaScript对象失去跨函数的引用,javascript,jquery,sapui5,Javascript,Jquery,Sapui5,我正在用一个小的待办事项列表应用程序测试SAPUI5框架。我有一个数据库,并通过REST服务访问数据。我能够将所有内容都输入我的UI,并从UI输入数据库 但是,我将数据库数据的引用保存在一个JSON模型中,该模型映射到我在UI上显示的表中。当我尝试添加/删除元素时,对数据库的写入似乎工作正常,但我的intern模型变量在不同的函数调用之间失去了引用(“initToDoModel”和“addToDo”就是一个例子)。代码如下: sap.ui.controller("sapui5_test.SA
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函数,从db获取数据,将其映射到JSONModel对象中。然后,当我单击页面上的Add按钮时,会调用addToDo函数,需要更新缓存的JSONModel,此时尚未定义该JSONModel
我是JavaScript新手,所以也许有人可以解释那里发生了什么。你可以console.log(这个)代码>在AJAX回调内部-您可能会看到它引用了窗口
对象
通过在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();
});
},
您可以console.log(这个)代码>在AJAX回调内部-您可能会看到它引用了窗口
对象
通过在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中该行为的更多细节感兴趣,请检查以下问题:此
的可能重复不是您所认为的。将其存储在另一个变量中,并使用该变量。如果您对JavaScript中该行为的更多细节感兴趣,请检查以下问题:可能重复