AngularJS从模态控制器访问父控制器属性 - 解析vs $ scope

时间:2017-08-09 20:45:15

标签: javascript angularjs angular-ui-bootstrap

学习AngularJS对我来说是一项正在进行的工作,所以我只想了解为什么/何时应该在下面的特定情况下使用一个。这只是味道还是更重要的问题?见下面的例子。

在这两种情况下,当用户单击确定按钮时,将从子控制器调用父控制器的create()功能。

解决风格

CreateController

...

var vm = this;

vm.create = create;

function create() {
    console.log('Created!');
}

vm.openCreateModal = function() {
    vm.modalInstance = $uibModal.open({
        ...
        resolve: {
            create: function() {
                return create;
            },
            // Others if any
        }
    });
}

...

CreateModalController

...

vm.ok = function() {
    create();
    $uibModalInstance.close('ok');
};

...

SCOPE STYLE

CreateController

...

var vm = this;

vm.create = create;

function create() {
    console.log('Created!');
}

vm.openCreateModal = function() {
    vm.modalInstance = $uibModal.open({
        ...
        scope: $scope,
        resolve: {
        }
    });
}

...

CreateModalController

...

vm.ok = function() {
    $scope.$parent.vm.create();
    $uibModalInstance.close('ok');
};

...

更新

我提出这个问题的实际原因是,将一个服务/控制器的对象的父/根/容器作为/向另一个控制器/服务进行访问/注入被认为是一种错误的做法"在我使用的一些语言/框架中。

1 个答案:

答案 0 :(得分:1)

resolve的想法是在初始化其余代码之前先运行它。通常,您会在resolve中使用routing,如此:

$routeProvider
        .when('/', {
            templateUrl: "views/view.html",
            caseInsensitiveMatch: true,
            resolve: {
                load: function() {
                    localStorage['Location'] = "/View";
                }
            }
        })

在上面的示例中,resolve将在我的控制器初始化之前触发load function。另一方面,scope用于直接绑定到控制器或指令中的某些内容。在触发函数和绑定控制器和指令之间的值时,应使用scope

要根据以下评论添加此内容,如果resolve失败,则会拒绝该模式,并且窗口将无法打开。