Бриз 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.

Другие вопросы по тегам