在嵌套控制器中保存一对多

时间:2014-02-01 14:58:24

标签: angularjs breeze angularjs-scope hottowel

我一直在研究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父控制器无法读取子属性,因此通常的解决方案是在父级中创建属性并在子级中引用它。但是,由于我想要引用的属性依赖于仅在子代中获取的实体,因此无法完成。

还是可以吗?任何想法或其他推荐的方法。我真的很想避免只有一个父控制器......

0 个答案:

没有答案