2013-11-22 36 views
0

我正在用一个待办事项列表应用程序测试SAPUI5框架。我有一个数据库并通过REST服务访问数据。我能够将所有内容都放入我的用户界面,并从用户界面进入数据库。JavaScript对象失去了函数的参考

但是,我保存了一个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新手,所以也许有人可以解释发生了什么。

+8

'这不是你想象的那样。将它存储在另一个变量中并改为使用该变量。 –

+0

如果你有兴趣了解更多关于JavaScript的行为细节,请查看这个问题:http://stackoverflow.com/questions/3127429/javascript-this-keyword – cschuff

回答

5

您可以在您的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(); 
     }); 
    },