AngularJS:在没有工厂,服务或广播的情况下将数据从控制器传递到控制器?

时间:2016-08-01 12:30:11

标签: javascript angularjs controller angularjs-scope

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

工厂和服务被排除在外,因为我最终想要将我的应用程序迁移到角度2,并且我不想使用看似与广播/向上/不兼容的ngclick。 如果有人知道如何使用广播在后台传递数据(没有用户交互,如输入或ngclick),它将起作用:)

我有什么选择? 谢谢!

2 个答案:

答案 0 :(得分:1)

如果您有嵌套组件,则可以使用require

访问父级数据
var child = {
    bindings: {},
    require: {
        parent: '^^parent'
    },
    controller: childController,
    templateUrl: 'child.template.html'
};

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

this.parent.parentMethod();

您在上一个答案中有一些更详细的代码:

Where should I place code to be used across components/controllers for an AngularJS app?

您的其他选择:

绑定

就像指令' 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});
});

广播和发出事件

如果您正在广播的事件在应用程序范围内有意义(登录,注销等等),那么该怎么办?如果您正在更新组件中的变量,请不要&# 39;使用它。

答案 1 :(得分:1)

  

我不想使用服务或工厂,并希望通过   例如数据数组

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