AngularJS:将数据从控制器传递到控制器,无需工厂、服务或广播

AngularJS : pass data from controller to controller without factory, service or broadcast?

本文关键字:控制器 工厂 广播 服务 数据 AngularJS      更新时间:2023-09-26

我不想使用服务或工厂,我想传递例如一个数据数组。我想从子组件访问父控制器中的数据。

工厂和服务被排除在外,因为我最终想将我的应用程序迁移到angular 2,而且我不想使用ngclick,它似乎无法与广播/up/on一起使用。如果有人知道如何使用广播在后台传递数据(无需用户交互,如输入或ngclick),它也会起作用:)

我有什么选择?非常感谢。

如果您有嵌套组件,您可以使用require 访问父级的数据

var child = {
    bindings: {},
    require: {
        parent: '^^parent'
    },
    controller: childController,
    templateUrl: 'child.template.html'
};

现在,在您的子控制器中,您可以访问父控制器的实例,因此可以调用方法并访问其属性:

this.parent.parentMethod();

您在前面的回答中有一些更详细的代码:

我应该将AngularJS应用程序的组件/控制器之间使用的代码放在哪里?

您的其他选择:

绑定

就像指令的scopebindToController一样,您可以使用组件的bindings属性通过html属性绑定数据和方法

<component-x shared="$ctrl.shared"></component-x>
var componentX = {
    bindings: { shared: '=' }
    ...

$rootScope

永远不要用它来存储数据。它是有效的,但它不是为了这个目的而制作的,并且会导致无法维护的代码。

服务

共享数据应该通过服务来完成,这是一种常见的误解。不过,在1.5之前,这是一个真实而良好的实践。

控制器继承

另一种不良做法(imo)。在经典MVC应用程序中,嵌套的控制器可以通过$controller服务继承父级:

.controller('MainController', function ($scope) {
    $scope.logMessage = function(message) {
        console.log("Message: " + message);
    }
})
.controller('ServicesController', function($scope, $controller) {
    $controller('MainController', {$scope: $scope});
});

广播和发射事件

如果您正在广播的事件在整个应用程序范围内有意义(登录、注销等),请使用此方法。如果您正在更新组件中的变量,请不要使用它。

我不想使用服务或工厂,我想冒充示例数据阵列

您可以使用localStorage/sessionStorage来存储和获取数据