2012-09-18 48 views
4

我有兩個函數generatetest。當用戶點擊一個按鈕時generate被調用,然後調用test函數。我收到以下錯誤:傳遞函數返回ko.computed的值

Pass a function that returns the value of the ko.computed.

的錯誤是在這條線的測試功能:拋出

var unmapped = ko.mapping.toJS(this); 

this是我的視圖模型與ko.observable性能。

這裏有兩個功能。如果我將test函數的內容移動到generate一切正常,但我需要邏輯處於兩種不同的功能。我能做什麼?

我很困在這裏。任何幫助都會大大降低。

generate = function() { 
      if (!omega.validatableFranchiseGeneration.validate()) { 
       return false; 
      } 
      omega.franchiseInfo.IsForGeneration(true); 

      test(); 
     } 

var test = function() { 
     getIpsAndPorts(); 

     for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) { 
      if ($.isArray(omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel)) { 
       omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel = omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel[0]; 
      } 
     } 

     var unmapped = ko.mapping.toJS(this); 

     var jsonData = ko.toJSON(unmapped); 
     $.ajax({ 
      url: "/franchise/Save", 
      type: "POST", 
      // data: ko.toJSON({ folderName: FolderName }), 
      data: { franchiseInfoViewModel: jsonData }, 
      //traditional: true, 
      //contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
      success: function (data, textStatus, xhr) { 
       window.location.href = data.redirectToUrl; 
      }, 
      error: function (request, status, error) { 
       jsonValue = jQuery.parseJSON(request.responseText); 
       omega.franchiseInfo.errorMessages([]); 
       for (var i = 0; i < jsonValue.errorMessages.length; i++) { 
        omega.franchiseInfo.errorMessages.push({ errorMessage: ko.observable(jsonValue.errorMessages[i].ErrorMessage) }); 
       } 
       for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) { 
        InitializeViewLanguagesInfo(omega.franchiseInfo.LanguagesInfoViewModel()[i]); 
       } 
      } 
     }); 
    } 

回答

1

沒有看到所有的代碼,這是很難確定的,但如果該代碼(這是)的作品直接計入當生成,那麼我願意打賭,this是不是你認爲它在test函數中。 thistest函數中的含義與generate中的不同。

觸發Chrome或Firebug並在var unmapped = ko.mapping.toJS(this);行上設置斷點。運行你的程序,當斷點碰到控制檯,看看this。它是你的ViewModel嗎?

如果this是你所期望的內部generate你可以隨時撥打test這樣的:

test.apply(this); 

這將明確設置的this的方法調用的上下文。

另一種選擇是在您的ViewModel中設置一個self變量。這通常在頂部完成,如下所示:var self = this;。通過創建這個變量,你可以參考self' inside any functions within the outer "function" scope, and not have to worry about the value of這個波動。

-

下面是一個簡單的小提琴模仿,我認爲正在發生的事情:http://jsfiddle.net/jearles/aLFWe/

打開瀏覽器或Firebug的控制檯,並期待在記錄對象。請注意,Window是我剛剛調用updatea()時記錄的對象,但在原始點擊函數中爲Object,並且當我調用updateb.apply(this)updatec()(其引用爲self)時。

+0

謝謝你的回答。我重構了我的邏輯並轉向了另一種解決方案。不過,我接受你的答案。 – Mdb