Бриз 1-м-1 в HotTowel Angular с локальным хранением
Недавно у меня было требование внедрить пользовательский интерфейс для управления отношениями многие-многие. Уорд Белл любезно предоставил этот плункер, показывающий, как реализовать 1-м-1 с Angular и Breeze.
Дизайн моего приложения основан в основном (особенно на тексте данных и локальном хранилище) в основном на последних курсах Джона Папы по Pluralsight.
В моем приложении BusUnit = Hero и Dimension = Power (в соответствии с примером Уорда.
Кажется, что все работает хорошо, когда я заставляю приложение извлекать данные с сервера, так как мои обновления в измерениях бизнес-единицы отражаются правильно. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я ухожу от страницы и возвращаюсь назад (которая получает данные из локального хранилища). В этом случае:
- если я ранее добавил новое измерение в бизнес-единицу, все в порядке, но
- если я ранее пометил измерение бизнес-единицы для удаления и сохранения, измерение по-прежнему отображается для рассматриваемой бизнес-единицы.
это код контроллера, который изначально получает бизнес-единицы и их размеры:
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);
}
это мой код данных для пометки удаленного элемента:
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;
}
}
Мое отклонение от примеров курса Джона состоит в том, что я использую функцию расширения в функции, которую я использую для получения бизнес-единиц с сервера, и моя гипотеза заключается в том, что это как-то связано с тем, что ветер отправляется на сервер каждый раз, когда я обновляю страница (без очистки кеша), и это также связано с ошибкой, которую я получаю, если я ухожу, а затем возвращаюсь на страницу.
Может ли кто-нибудь предложить и предложения?
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 Guide по стилю с его курсом SPA/Angular/Breeze.