AngularJS双向数据绑定

时间:2015-11-20 13:14:32

标签: angularjs modal-dialog

在我的控制器中,我有以下数据:

(function() {
'use strict';

angular
    .module('myappl.mymodule')
    .controller('MyController', MyController);

MyController.$inject = ['$scope', 'myService'];

function MyController($scope, 'myService') {
    $scope.vm = this; 
    var vm = this;

    vm.myService = myService;

    vm.userManagement = userManagement.data;
    vm.userManagementSomeDataObjects = vm.userManagement.someDataObjects;

在这个控制器的某个地方,我有一个函数,它首先从后端获取数据,然后调用 showModal

function modalForUserInteraction() {
        vm.myService.getData(parameters).success(function(data) {
            vm.modalService.showModal(data, vm.userManagement, vm.userManagementSomeDataObjects);
        }).error(function(data) {
            console.log('error');
        });
    }

模态控制器如下所示:

...
function showModalService($modal, $stateParams, otherService) {
    var service = {
        showModal: showModal
    };      
    return service;

    ////////////

    function showModal(data, userManagement, userManagementSomeDataObjects) {
         var myModal = $modal.open({
            controller: ModalController,
            controllerAs: 'vm',
            windowClass: "modal fade in",
            resolve: {  
                userManagement: function() {
                return userManagement;
            },
            userManagementSomeDataObjects: function() {
                return userManagementSomeDataObjects;
            }
            },  
            templateUrl: 'url/to.html'
        });
        return myModal;

并且在模态控制器中有一个像这样的方法:

function ModalController(userManagement, userManagementSomeDataObjects) {
var vm = this;

...

function doSomeActionAfterButtonClickAtModal() {
    otherService.getDataFromBackend(params).success(function(data) {

        userManagement = data;
            userManagementSomeDataObjects = data.someDataObjects;

})error(function(data) {
    console.log('error');
});
}

如果我这样做:

userManagement = data; userManagementSomeDataObjects = data.someDataObjects; ,但未设置新数据。

如果我分别设置对象的每个属性,而不是经常工作,但有些情况则不然。

我现在的问题是我能做些什么才能让它发挥作用。 目前我的模态中没有$ scope-variable,实际上我不知道 如果 $ scopeOfModal。$ apply()会有所帮助,而且我也不知道如何从模态访问 MyController - $ scope

对于这方面的任何暗示,我都很高兴。

非常感谢!

[编辑] 这是我当前查看的图像(右)和左侧的对象,应在设置模态函数后显示。

enter image description here

[编辑]

是否有任何可能性在模态控制器中将参数传递给此函数:

this.previewArchivedSchedule = function(hereINeedParamerts) {
             alert('archivedScheduleIntervalContainerId: ' + hereINeedParamerts); 
          };

1 个答案:

答案 0 :(得分:0)

这对我来说就像它可能与angular无关,只是与javascript变量引用有些混淆。

首先,您通过userManagementshowModalService.showModalModalController传递到resolve

所以现在ModalController引用了与showModalService相同的对象。

但是,在ModalController中,您重新指定userManagement变量以指向data。所以现在userManagement内的ModalController变量不再指向注入的对象,因为您已经重新分配它。这与角度双向数据绑定无关,它只是javascript变量赋值。您已丢失对原始对象的引用。

showModalService仍然引用它通过resolve发送的实例,它不知道您在ModalController中交换了引用。

我尝试发送一个封装您要共享的数据的对象来修复此问题。

function showModal(data, userManagement, userManagementSomeDataObjects) {
     var myModal = $modal.open({
        controller: ModalController,
        controllerAs: 'vm',
        windowClass: "modal fade in",
        resolve: {  
            sharedData: function() {
                return {
                    userManagement: userManagement,
                    userManagementSomeDataObjects: userManagementSomeDataObjects
                }
        }, 
        templateUrl: 'url/to.html'
    });
    return myModal;

然后操纵共享对象上的属性,而不是覆盖引用。

function ModalController(sharedData) {
var vm = this;

...

function doSomeActionAfterButtonClickAtModal() {
    otherService.getDataFromBackend(params).success(function(data) {
        sharedData.userManagement = data;
        sharedData.userManagementSomeDataObjects = data.someDataObjects;
    })error(function(data) {
        console.log('error');
    });
}