2014-02-05 12 views
0

我最近有一個要求是實現一個用於管理多關係的UI。沃德貝爾友善地提供this plunker顯示如何使用1米-1與角和微風。微風1-m-1在HotTowel Angular與本地存儲

我的應用程序的設計主要基於John Papa最近推出的Pluralsight課程(主要基於datacontext和本地存儲)。

在我的應用程序,BusUnit =英雄和尺寸=功率(參考病區的例子。

一切似乎運作良好時,我強迫應用從服務器獲取數據,在我更新到業務單位的尺寸反映正確的,我現在面臨的問題是,當我從頁面導航離開和回來(這會從本地存儲數據)。在這種情況下:。

  • 如果我以前添加一個新的維度到一個業務部門,一切都很好,但是
  • 如果我以前標記過商家單位的維度用於刪除和保存,維度仍然出現在相關業務單位中。

這是控制器代碼,最初得到業務部門和它們的尺寸:

function getdboardStructure() { 
     var busUnitsPromise = datacontextSvc.busUnits.getByDboardConfigId(vm.dboardConfig.id); 
     var dimensionsPromise = datacontextSvc.dimensions.getByDboardConfigId(vm.dboardConfig.id); 

     $q.all([busUnitsPromise, dimensionsPromise]) 
      .then(function (values) { 
       vm.busUnits = values[0]; 
       vm.dims = values[1]; 
       createBusUnitVms(); 
       //vm.currentBusUnitVm = vm.busUnitVms[0]; // not required as using accordion instead of drop-down 
       vm.hasChanges = false; 
      }); 
    } 

這是我的控制器準備的代碼保存:

function applyBusUnitDimensionSelections(busUnitVm) { 
     var busUnit = busUnitVm.busUnit; 
     var mapVms = busUnitVm.dimensionMapVms; 
     var dimensionHash = createBusUnitDimensionHash(busUnit); 

     mapVms.forEach(function (mapVm) { 
      var map = dimensionHash[mapVm.dimension.id]; 

      if (mapVm.selected) { 
       if (!map) { 
        datacontextSvc.busUnits.addBusUnitDimension(busUnit, mapVm.dimension) 
        .then(function() { 
        }); 
       } 
      } else { 
       if (map) { 
        datacontextSvc.markDeleted(map); 
       } 
      } 
     }); 
    } 

這是代碼在我的控制器執行保存:

function save() { 
     if (!canSave()) { 
      return $q.when(null); 
     } 

     vm.isSaving = true; 
     vm.busUnitVms.forEach(applyBusUnitDimensionSelections); 
     return datacontextSvc.save().then(function (saveResult) { 
      vm.isSaving = false; 
      trapSavedDboardConfigId(saveResult); // not relevant to use case 
     }, function (error) { 
      vm.isSaving = false; 
     }); 
    } 

這是我的存儲庫添加新busUnitDimension實體代碼:

function addBusUnitDimension(busUnit, dimension) { 
     var newBusUnitDimension = this.em.createEntity(busUnitDimension); 
     newBusUnitDimension.busUnitId = busUnit.id; 
     newBusUnitDimension.dimensionId = dimension.id; 
     return this.$q.when(newBusUnitDimension); 
    } 

這是我打標刪除了一個項目的DataContext代碼:

function markDeleted(entity) { 
     return entity.entityAspect.setDeleted(); 
    } 

最後,這是庫代碼來獲得業務單元和它們的連接表實體:

function getByDboardConfigId(dboardConfigId, forceRefresh) { 
     var self = this; 
     var predicate = pred.create('dboardConfigId', '==', dboardConfigId); 
     var busUnits; 

     if (self.zStorage.areItemsLoaded('busUnits') && !forceRefresh) { 
      busUnits = self._getAllLocal(entityName, orderBy, predicate); 
      return self.$q.when(busUnits); 
     } 

     return eq.from('BusUnits') 
      .expand('BusUnitDimensions') 
      .where(predicate) 
      .orderBy(orderBy) 
      .using(self.em).execute() 
      .to$q(succeeded, self._failed); 

     function succeeded(data) { 
      busUnits = data.results; 
      self.zStorage.areItemsLoaded('busUnits', true); 

      self.zStorage.save(); 
      //self.logSuccess('Retrieved ' + busUnits.length + ' business units from server', busUnits.length, true); 
      return busUnits; 
     } 
    } 

我從約翰的課程示例中脫離出來,我在函數中使用擴展來獲得商業單位來自服務器,我的假設是,這與微風每次刷新頁面(而不是清除緩存)都會進入服務器這一事實有關,而且這也與錯誤i'如果我導航離開然後回到頁面,則會收到。

任何人都可以提供和建議嗎?

+0

我不太明白你在問什麼,但考慮到你在這個話題上提出了很多問題,並給予了熱烈的支持,因爲我建議你看看維持微風的公司提供的支持。你已經進入了高度自定義場景的境界,這些場景很難像我這樣的普通人。 –

+0

我明白你的意思,但我的觀點是,這個話題會對很多SO用戶感興趣,在這裏發佈問題將爲那些有類似需求的人提供價值。雖然這個要求可能是一個共同的線索,但這些問題都與滿足要求的不同方面有關。 – zpydee

+0

但我仍然不知道你在談論什麼共同的線程,要求或其他任何東西。 –

回答

1

欣賞這是很久以前,你可能已經解決了它或繼續前進,但我最近遇到了同樣的問題,最近花了我很多時間來解決。 我發現的答案是你必須編輯JP的angular.breeze.storagewip.js文件。 我包含硬編碼到文件中的實體的名稱,您將需要更改這些以匹配您自己的實體。

在有些情況下,你需要做這兩個功能,下面的例子展示我使用與四個實體的變化:

function zStorageCore($rootScope, zStorageConfig) { 
    var storeConfig = zStorageConfig.config; 
    var storeMeta = { 
     breezeVersion: breeze.version, 
     appVersion: storeConfig.version, 
     isLoaded: { 
      elementAssets : false, 
      surveyors : false, 
      elements : false, 
      assets : false 
     } 
    }; 

和...

function checkStoreImportVersionAndParseData(importedData) { 
     if (!importedData) { 
      return importedData; 
     } 
     try { 
      var data = JSON.parse(importedData); 
      var importMeta = data[0]; 
      if (importMeta.breezeVersion === storeMeta.breezeVersion && 
       importMeta.appVersion === storeMeta.appVersion) { 
       if (importMeta.isLoaded) { 
       storeMeta.isLoaded.assets = storeMeta.isLoaded.assets || importMeta.isLoaded.assets; 
       storeMeta.isLoaded.elements = storeMeta.isLoaded.elements || importMeta.isLoaded.elements; 
       storeMeta.isLoaded.surveyors = storeMeta.isLoaded.surveyors || importMeta.isLoaded.surveyors; 
       storeMeta.isLoaded.elementAssets = storeMeta.isLoaded.elementAssets || importMeta.isLoaded.elementAssets; 
       } 
       return data[1]; 
      } else { 
       _broadcast(storeConfig.events.error, 
        'Did not load from storage because mismatched versions', 
        { current: storeMeta, storage: importMeta }); 
      } 
     } catch (ex) { 
      _broadcast(storeConfig.events.error, 'Exception during load from storage: ' + ex.message, ex); 
     } 
     return null; // failed 
    } 

我解決了這個由比較JP的風格指南課程文件和他的SPA/Angular/Breeze課程。