我一直在研究Angular和Breeze中一对一关系的要求,到目前为止,我试图在我的解决方案中应用来自this post的Ward Bell的建议。要查看我目前使用的代码,请访问my original question并查看我自己提交的答案。
问题,我现在面临的是当我想为saveChanges做准备时。原因是,我使用了嵌套控制器。调用save的函数位于我的父控制器中,并且保存受影响的one-may-one实体的属性位于子控制器上。
在父控制器中......
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;
}
});
});
});
}
问题的根源是,在我调用了busUnits之后,对一对多实体的调用和关联项viewmoder数组(buChannels)的创建才会发生,并且对busUnits的调用发生在儿童控制器。此外,需要为每个busUnit存储buChannels数组。
由于Angular父控制器无法读取子属性,因此通常的解决方案是在父级中创建属性并在子级中引用它。但是,由于我想要引用的属性依赖于仅在子代中获取的实体,因此无法完成。
还是可以吗?任何想法或其他推荐的方法。我真的很想避免只有一个父控制器......