JavaScript对象失去跨函数的引用

JavaScript对象失去跨函数的引用,javascript,jquery,sapui5,Javascript,Jquery,Sapui5,我正在用一个小的待办事项列表应用程序测试SAPUI5框架。我有一个数据库,并通过REST服务访问数据。我能够将所有内容都输入我的UI,并从UI输入数据库 但是,我将数据库数据的引用保存在一个JSON模型中,该模型映射到我在UI上显示的表中。当我尝试添加/删除元素时,对数据库的写入似乎工作正常,但我的intern模型变量在不同的函数调用之间失去了引用(“initToDoModel”和“addToDo”就是一个例子)。代码如下: sap.ui.controller("sapui5_test.SA

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

但是,我将数据库数据的引用保存在一个JSON模型中,该模型映射到我在UI上显示的表中。当我尝试添加/删除元素时,对数据库的写入似乎工作正常,但我的intern模型变量在不同的函数调用之间失去了引用(“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函数,从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中该行为的更多细节感兴趣,请检查以下问题:可能重复