使用可以在 Angular 中的所有组件之间共享的范围

Using scope which can be shared between all components in Angular

我有一个使用一种方法的简单控制器:

app.controller('MyApp', function($scope) {
     $scope.myMethod() {...}
}

我还有很多用于输入字段的组件(例如用于文本输入、数字输入、复选框、收音机等):

app.component('TextInput', {
    template: "<input type='text' ng-change='$ctrl.myMethodInComponent()' ng-model='inp' />",
    bindings: {
        myMethod: '&',
    },
    controller: function() {
        var ctrl = this;
        ctrl.myMethodInComponent = function() {
            /* some customizations */
            ctrl.myMethod();
        }
    }
});

我按以下方式创建此输入:

<text-input myMethod="myMethod()"></text-input>

一切都按预期工作,但问题是我有很多组件想使用主控制器的方法 'myMethod',我不想使用绑定('&' ). 相反,我想在 mainScope 之类的东西中使用这个方法。我知道 Angular 提供了 rootScope,但我不知道如何在我的案例中使用它。是否有可能将 'myMethod' 附加到将在我的所有组件之间共享的某个主要(根)范围?

你想做的事情可以通过服务和工厂来实现。仔细研究一下,如果您需要帮助或模板,请问我。

编辑 模板

app.factory('myFactory', function($scope)
    var ret = {
        myMethod: myMethod,
        myMethodWithParams: myMethodWithParams
    }
    return ret;

    function myMethod() {...}
    function myMethodWithParams(param1, param2) {...}
}

现在,在您的控制器中,您可以将其用作依赖项

app.controller('myController', function(myFactory) {
    var x = myFactory.myMethod();
    var y = myFactory.myMethodWithParams('hello', 'world');
});

不确定这是您使用 $rootScope 寻找的那种用例,但这里有一个解决方案:

    angular.module('myApp', [])

    .controller('MyController', function ($scope, $rootScope) {
        $scope.message = 'Hello from Controller 1';

        $scope.$watch('message', function () {
            $rootScope.$emit('controller1_scope_change', {
                message: $scope.message
            });
        });

    }).controller('MyController2', function ($scope, $rootScope) {
        $scope.message = 'Hello from Controller 2, here is the output from Controller 1:';

        $rootScope.$on('controller1_scope_change', function (event, args) {
            console.log('arguments received by the handler for the event: ', args);
            $scope.message2 = args.message;
        });

        // really hacky way of doing it
        /*var controller1_scope = angular.element(document.querySelector('#controller1')).scope();
        controller1_scope.$watch(function () {
            $scope.message2 = controller1_scope.message
        });*/
    });

View example here on codepen