Я работал над требованием отношения «один-многие-один» в 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 не могут читать дочерние свойства, обычным решением будет создание свойства в родительском элементе и ссылка на него в дочернем элементе. Но, поскольку свойство, на которое я хотел бы сослаться, зависит от сущности, которая извлекается только в дочернем элементе, это невозможно сделать.
Или может? Любые идеи или другие рекомендуемые подходы. Я бы очень хотел избежать наличия только родительского контроллера...