2012-12-03 16 views
4

在我的KnockoutJS視圖模型邏輯中,我有一個當前顯示對象(項目視圖模型)的可觀察數組:self.currentProjects。根據項目篩選設置(用戶動態選擇項目類型)self.currentProjects包含UI綁定的不同對象。ObservableArray.RemoveAll()清空不同變量中的拼接對象

在某些情況下,我需要將不同的項目加載到視圖中,我需要清空currentProjects並將不同的模型放入其中。我通過調用self.currentProjects.removeAll();來解決這個問題,當我打電話給它時,另一個可觀察的數組self.ProjectModels應該保持對同一組模型的引用也顯示爲空。我應該如何管理可觀察數組中的對象,以便從一個數組中移除不會導致另一個數組變爲空。

這裏是一個操作相關的代碼:

//Another menu item is selected 
    self.selectItem = function(newId) { 
     self.selectedItemId(newId); 
     self.currentProjects.removeAll(); //This is the point where self.ProjectModels also looses model references 
     var someProjectsLoaded = false; 
     jQuery.each(self.projectModels, function (i, val) { 
      if (val.type == self.selectedItemId()) { 
       self.currentProjects(val.models); 
       var projectsPerPage = parseInt($('#ProjectsPerPage').val(), "10"); 
       self.page(val.models.length/projectsPerPage); 
       someProjectsLoaded = true; 
      } 
     }); 
     if (!someProjectsLoaded) { 
      self.page(1); 
      self.LoadMoreProjects(); 
     } 
    }; 

    self.LoadMoreProjects = function() { 
     var getProjectsUrl = $("#GetNextProjectsUrl").val(); 
     $.ajax({ 
      url: getProjectsUrl, 
      data: { 
       page: parseInt(self.page(), "10"), 
       type: self.selectedItemId() 
      }, 
      beforeSend: function() { 
       //$("#ajaxload").show(); 
      }, 
      success: function (result) { 
       var newlyAddedModelsArray = jQuery.map(result, function (val, i) { 
        var vm = new ProjectViewModel(val, self); 
        self.currentProjects.push(vm); 
        return vm; 
       }); 
       self.page(parseInt(self.page(), "10") + 1); 
       var typeAlreadyInChache = false; 
       jQuery.each(self.projectModels, function (i, val) { 
        if(val.type == self.selectedItemId()) { 
         val.models = val.models.concat(newlyAddedModelsArray); //HERE IS WHERE I SUSPECT A COPY BE REFERENCE TAKES PLACE 
         typeAlreadyInChache = true; 
        } 
       }); 
       if(!typeAlreadyInChache) { 
        self.projectModels.push({ type: self.selectedItemId(), models: newlyAddedModelsArray }); 
       } 
      }, 
      error: function() { 
       $("#error").show(); 
      } 
     }); 
    }; 
+0

你的視圖模型的其餘部分是什麼樣的? –

回答

11

調用removeAll清空基礎數組和你的兩個觀測似乎有相同的數組的引用。

一個簡單的選擇是將currentProjects設置爲空數組而不是調用removeAll

self.currentProjects([]); 

現在,原始數組將保持原樣。

+0

你有什麼想法可以引入哪個版本?我們最近從2.1.0升級到3.4.0,並且出現了這個問題 – Vladimirs