AngularJS:与兄弟或后代范围共享范围行为

时间:2013-09-13 12:57:45

标签: javascript angularjs

是否可以从我的应用程序层次结构中较高的某个控制器共享范围行为,以便它能够将来自不相关/未连接范围的数据作为一种抽象和单独的“远程控制”进行管理?

这就是我在psudo-angular中设置的东西:

//Looking to share the ManagedScope1 and ManagedScope2 "changeChannel()" behavior with this controller
<RemoteControlCtrl>
  <ng-click="managedScope1.changeChannel()"></ng-click>
  <ng-click="managedScope2.changeChannel()"></ng-click>
</RemoteControlCtrl>

//ManagedScopes inherit ChangeChannelCtrl scope behaviors
<ChannelChangeCtrl with $scope.changeChannel() method>
  <ManagedScope1></ManagedScope1>
  <ManagedScope2></ManagedScope2>
</ChannelChangeCtrl>

$scope.changeChannel()方法在两个托管范围中都继承,并且可以相应地对自己的数据执行操作。

2 个答案:

答案 0 :(得分:0)

你需要一个ChannelService ....

.service('ChannelService', function () {
    return {
        changeChannel: function (scopeData, callback) {
             //change the channel

             if (angular.isFunction(callback)) {
                  callback();
             }
        }
    };
});

用法:

.controller('MyController', ['$scope', 'ChannelService', function ($scope, ChannelService) {
     $scope.dataForChangingChannel = {};
     $scope.changeChannel = function () {
          //do UI stuff here

          ChannelService.changeChannel($scope.dataForChangingChannel, function () {
                //or UI stuff here, after the channel has been changed
          });
     }
}]);

答案 1 :(得分:0)

这取决于生成范围的组件类型。

如果它是完全不相关的范围,则应使用$broadcast。您可以要求$rootScope作为远程控制器和$rootScope.$broadcast('eventName', someData)中的依赖项。在您的频道控制器中:

$scope.$on('eventName', function(event, data) {
    // Do something here
})

另一个好主意是使用服务,但在另一个范围内调用方法仍然很难。我会说事件广播对你的问题很好。