Сохранение «один-многие-один» во вложенных контроллерах

Я работал над требованием отношения «один-многие-один» в Angular и Breeze и пытался применить рекомендацию Уорда Белла из этот пост в моем решении до сих пор. Чтобы увидеть код, который я использую до сих пор, посетите мой исходный вопрос и проверьте ответ, который я отправил сам.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу подготовиться к saveChanges. Причина в том, что я использовал вложенные контроллеры. Функция, которая вызывает сохранение, находится в моем родительском контроллере, а свойство, содержащее затронутые мной сущности «один-может-один», находится в дочернем контроллере.

В родительском контроллере...

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

        // CODE TO PREPARE THE ONE-MANY-ONE ENTITIES FOR
        // SAVING SHOULD GO HERE I'M GUESSING...

        vm.isSaving = true;
        return datacontextSvc.save().then(function(saveResult) {
            vm.isSaving = false;
            trapSavedDboardConfigId(saveResult);
        }, function(error) {
            vm.isSaving = false;
        });
    }

а в дочернем контроллере...

function getBusUnits() {
    ...
    .then(function(data){
        vm.busUnits = data;
        vm.busUnits.forEach(function(bu){
            getBusUnitChannels(bu);
        });
    });
}

function getBusUnitChannels(busUnit) {
        datacontextSvc.dboardConfigs.getBusUnitChannelsById(busUnit.id)
            .then(function (data) {
                busUnit.busUnitChannelsList = data;

                // THE PROBLEM IS THAT THE BUCHANNELS ARRAY IS CREATED
                // FOR EACH BUSUNIT AND THE LIST OF BUSUNITS IS ONLY 
                // CALLED IN THE CHILD CONTROLLER.
                // DOES THIS IMPLY I CAN'T HAVE A PROPERTY IN THE PARENT CONTROLLER
                // THAT I CAN REFERENCE IN THE CHILD, SO THAT THE PARENT CAN ACCESS
                // THE DATA DURING SAVE?

                busUnit.buChannels = []; // HOW DO I DEFINE THIS GUY IN THE PARENT?
                vm.channels.forEach(function (channel) {
                    busUnit.buChannels.push(channel);
                });

                busUnit.busUnitChannelsList.forEach(function (buc) {
                    busUnit.buChannels.forEach(function (buCh) {
                        if (buc.channelId === buCh.id) {
                            buCh.buChannel = buc;
                            buCh.isSelected = true;
                        } else {
                            buCh.isSelected = false;
                        }
                    });
                });
            });
    }

Источником проблемы является то, что вызов сущности «один-многие-один» и создание связанного массива элементов представления (buChannels) происходит только после того, как я вызвал busUnits, а вызов busUnits происходит в дочернем контроллере. Кроме того, для каждого busUnit необходимо сохранить массив buChannels.

Поскольку родительские контроллеры Angular не могут читать дочерние свойства, обычным решением будет создание свойства в родительском элементе и ссылка на него в дочернем элементе. Но, поскольку свойство, на которое я хотел бы сослаться, зависит от сущности, которая извлекается только в дочернем элементе, это невозможно сделать.

Или может? Любые идеи или другие рекомендуемые подходы. Я бы очень хотел избежать наличия только родительского контроллера...


person zpydee    schedule 01.02.2014    source источник
comment
возможный дубликат примера Angular Breeze one-many-one с флажком   -  person PW Kad    schedule 01.02.2014
comment
не дубликат, а его расширение. первая часть моего вопроса касалась отображения результатов «один-многие-один». этот вопрос касается сохранения в сценарии родительско-дочернего контроллера.   -  person zpydee    schedule 01.02.2014
comment
Я прочитал ваш вопрос как распространение изменений дочернего контроллера на родительский, но я могу ошибаться. Если нет, будет ли этот вопрос уже отвечать на ваш вопрос: stackoverflow.com/questions/16972976/?   -  person nymo    schedule 02.02.2014