Angularjs 微风1-m-1在热毛巾中,本地储存
我最近有一个需求,需要实现一个UI来管理多个关系。Ward Bell善意地提供了演示如何使用1-m-1实现角度和微风 我的应用程序的设计主要基于(尤其是数据上下文和本地存储)John Papa最近的Pluralsight课程 在我的应用程序中,BusUnit=Hero,Dimension=Power(参考Ward的示例) 当我强制应用程序从服务器获取数据时,一切似乎都正常工作,因为我对业务部门维度的更新反映正确。我现在面临的问题是当我离开页面并再次返回(从本地存储获取数据)时。在这种情况下:Angularjs 微风1-m-1在热毛巾中,本地储存,angularjs,breeze,hottowel,Angularjs,Breeze,Hottowel,我最近有一个需求,需要实现一个UI来管理多个关系。Ward Bell善意地提供了演示如何使用1-m-1实现角度和微风 我的应用程序的设计主要基于(尤其是数据上下文和本地存储)John Papa最近的Pluralsight课程 在我的应用程序中,BusUnit=Hero,Dimension=Power(参考Ward的示例) 当我强制应用程序从服务器获取数据时,一切似乎都正常工作,因为我对业务部门维度的更新反映正确。我现在面临的问题是当我离开页面并再次返回(从本地存储获取数据)时。在这种情况下:
- 如果我之前向业务单元添加了一个新维度,那么一切都正常,但是
- 如果我以前将某个业务部门的维度标记为删除并保存,则该维度仍会显示在相关业务部门中
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;
});
}
这是我的控制器中执行保存的代码:
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);
}
这是用于标记已删除项目的my 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;
}
}
与John的课程示例不同的是,我在用于从服务器获取业务单元的函数中使用expand,我的假设是,这与每次我刷新页面(不清除缓存)时breeze都会进入服务器这一事实有关相反,如果我离开并返回页面,这也与我收到的错误有关
有人能提供建议吗?感谢这是很久以前的事了,你可能已经解决了它或继续前进了,但我最近遇到了同样的问题,我花了很多时间才解决。 我找到的答案是,您必须编辑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的Style Guide课程文件和他的SPA/Angular/Breeze课程解决了这个问题。我不太明白你在问什么,但是考虑到你在这个话题上提出了太多的问题,并且得到了压倒性的支持,我建议你考虑维护Breeze的公司的有偿支持。你已经冒险进入了对于像我这样的普通人来说,很难理解的高度定制的场景领域。我接受你的观点,但我的观点是,这一主题将引起很多用户的兴趣,在这里发布问题将为那些有类似需求的人提供价值。尽管需求可能是一个共同的主题,但问题都是相关的但我仍然不知道你在谈论什么共同的线索、需求或其他任何东西。我真的无法涉猎所有这些代码。但我的直觉与你的相似…缓存中保存的数据不再反映服务器的状态。如果你允许删除。您需要防止此类故障,并准备通过清除不再准确的(选定)实体(例如,已删除的“总线单元”及其依赖项)的缓存进行恢复。一种粗略但安全的方法是在服务器抛出保存异常时放弃,向用户道歉,清除所有易失性实体的缓存,然后重新开始。