如何告诉父状态控制器在子状态控制器中发生的事情

时间:2013-12-09 22:28:10

标签: angularjs angular-ui

在下面的设置上下文中,如何告诉父控制器(ZoneController)子控制器中发生的事情(ZoneCodeController)?

.state('zone',
{
    url:'/zone',
    controller:'ZoneController',
    templateUrl:'views/zone.html'
})
.state('zone.code',
{
    url:'/:zoneCode',
    controller:'ZoneCodeController',
    templateUrl:function(stateParams)
    {
        return 'views/zone-codes/'+stateParams.zoneCode+'.html';
    }
}

2 个答案:

答案 0 :(得分:3)

建议的方法是创建一个跨控制器共享数据的服务。我创造了类似的东西:

angular.module('MODULENAME', []).factory('SharedHashTable', function($rootScope, $log)  {
    var data = {};

    return {
        set: function(key, value) {
            data.key = value;
        },
        get: function(key) {
            return data.key;
        }

    };
});

然后你可以将SharedHashTable添加到任何控制器可以调用它的set或get方法:

// in controller 1
SharedHashTable.set("MyData", $scope.myData);
// in controller 2
$scope.otherData = SharedHashTable.get("MyData");

答案 1 :(得分:2)

如果您希望将父控制器订阅到子女中发生的事件,您可以使用$ emit。

.controller('ZoneController', function ($scope) {
    $scope.$on('eventName', function (data) {
        // Do something.
    });
})

.controller('ZoneCodeController', function ($scope) {

    $scope.somethingHappened = function () {
        var data = {key: 'value'};

        // Publish the event up the controller hierarchy.
        $scope.$emit('eventName', data);
    }

});

另外,如果您只想分享数据,服务可能是更好的选择。