2013-11-22 32 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(); 
     }); 
    },