2013-05-26 47 views
0

我有這樣的代碼:KnockoutJS最大調用堆棧大小超出

self.EditItemPopup = function (something) { 
    var temp = ko.mapping.toJS(something); 
    //self.ItemToEdit = ko.mapping.fromJS(temp, EditItem, self.ItemToEdit); 
    ko.mapping.fromJS(temp, EditItem,self.ItemToEdit); 
    self.FindMatchingCategory(something.CategoryID()); 
    $("#editItemPopup").dialog("open"); 
}; 

self.FindMatchingCategory = function (categoryID) { 
    ko.utils.arrayForEach(self.ViewModel().Categories(), function (categoryToFind) { 
     if (categoryToFind.CategoryID() == categoryID) { 
      self.ItemEditCategory(categoryToFind); 
     } 
    }); 
}; 

當一旦一切工作正常,但是當它被稱爲第二次我得到這個錯誤self.EditItemPopup被稱爲: 未捕獲的RangeError:最大調用堆棧大小超過

有人能告訴我問題在哪裏嗎?

謝謝!

編輯:

EditItem映射:

var EditItem = { 
    ItemName: ko.validatedObservable().extend({ 
     required: { 
      message: "Please enter an item name.", 
      insertMessages: false 
     } 
    }), 
    ItemCost: ko.validatedObservable().extend({ 
     required: { 
      message: "Please enter a valid price.", 
      insertMessages: false 
     } 
    }), 
    CategoryID: ko.observable() 
}; 
+0

你能提供的EditItem映射的JavaScript? – RodneyTrotter

+0

已更新。謝謝 – functionalCode

回答

-1

ko.mapping.fromJS有簽名:ko.mapping.fromJS(data, mappingOptions, viewModel);

然而,在你的情況下第二個參數看起來並不像映射選項。它看起來像視圖模型。

+0

這是不正確的,因爲ko.mapping.fromJS實際上接受兩個不同簽名中的參數,即使它在文檔中沒有完全清楚。 有一個內部檢查,如果參數2有一個「__ko_mapping__」字段,該參數將被用作「viewModel」。 這兩個簽名如下: ko.mapping.fromJS(data,mappingOptions,viewModel); 或 ko.mapping.fromJS(data,viewModel); – woobione

0

正如托馬斯提到的,你的映射看起來是錯誤的。這是一個潛在的解決方案。注意:我在這裏做了一些假設,因爲我看不到所有的模型。

定義編輯模型:

function EditItemModel(data){ 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 

    self.ItemName.extend({ 
     required: { 
      message: "Please enter an item name.", 
      insertMessages: false 
     } 
    }); 

    self.ItemCost.extend({ 
     required: { 
      message: "Please enter a valid price.", 
      insertMessages: false 
     } 
    }); 
} 

修改EditItemPopup功能是這樣的:

self.EditItemPopup = function (something) { 
    var temp = ko.mapping.toJS(something); 
    self.ItemToEdit(new EditItemModel(temp)); 
    self.FindMatchingCategory(something.CategoryID()); 
    $("#editItemPopup").dialog("open"); 
}; 
相關問題