1

引起無限遞歸,我被knockout.js映射其對IE無限遞歸。有人能更熟悉KO來發現我做錯了什麼嗎?knockout.js映射在IE9

我有以下knockout.js映射:


     var mapping = { 
      create: function(options) { 
       return new MyViewModel(options.data); 
      }, 
      'ChildItems': { 
       create: function(options) { 
        return new ChildVM(options.data); 
       } 
      } 
     } 

當我渲染網頁約。 5個IE中的1個結束了以下無限遞歸堆棧(導致「SCRIPT28:堆棧空間不足」)。 IE瀏覽器的調用堆棧:


    fromJS 
    MyViewModel 
    create 
    Anonymous Function 
    withProxyDependentObservable 
    createCallback 
    updateViewModel 
    fromJS 
    MyViewModel 
    create 
    Anonymous Function 
    withProxyDependentObservable 
    createCallback 
    updateViewModel 
     ... 

我的視圖模型構造:

function MyViewModel(data) { 
      var self = this; 
      this.$type = 'MyViewModel'; 

      [some observables]   
      ... 

      ko.mapping.fromJS(data, mapping, this); 
     } 

視圖模型的初始化是通過調用JSON端點進行:


      $.ajax({ 
       url: 'http://my.end/point', 
       type: 'POST', 
       data: JSON.stringify(payload), 
       contentType: 'application/json; charset=utf-8', 
       success: function(data) { 
        window.vm = ko.mapping.fromJS(data, mapping); 
        ko.applyBindings(window.vm) 
        } 
      }); 

回答

2

你應該將你的映射對象到2個對象。首先用於映射視圖模型,其次用於兒童。

var mapping = { 
      create: function(options) { 
       return new MyViewModel(options.data); 
      } 
     } 

var childrenMapping = { 
       'ChildItems': { 
        create: function(options) { 
         return new ChildVM(options.data); 
        } 
       } 
} 

您的ajax請求保持不變。更新MyViewModel函數以使用childrenMapping:

function MyViewModel(data) { 
      var self = this; 
      this.$type = 'MyViewModel'; 

      [some observables]   
      ... 

      ko.mapping.fromJS(data, childrenMapping, this); 
     } 

問題的根本原因是遞歸調用映射。當你致電ko.mapping.fromJS(data, mapping);敲除調用創建規則的地方創建MyViewModel對象。在MyViewModel的構造函數調用ko.mapping.fromJS由於在使用相同的基因敲除映射選項的要求,創建地方ko.mapping.fromJS被稱爲使用相同的選項MyViewModel對象相同的創建規則。

+0

謝謝你真的解決了這個問題。你能解釋一下在IE中首先引起遞歸的實際問題是什麼? – Fdr 2012-08-20 14:08:21

+0

歡迎您參閱最新的帖子以獲得澄清。 – 2012-08-20 17:50:55

+0

真正讓我困惑的是,爲什麼這種行爲只發生在IE瀏覽器上,更令人困惑的是,它只發生在30-40%的情況下? – Fdr 2012-08-21 05:32:15