2016-04-24 86 views
0

从另一个呼叫控制器我有Controller A,它负责在显示<body>数据。 我还有另一个Controller B,它位于用于显示导航的指令中。AngularJs在指令

我想将从Controller B(比如一串字符串)收到的数据传递给Controller A,然后使Controller A调用方法将数据绑定到主体。

到目前为止,我已经想通了一个脏soluton:到VAR变量中的数据存储我的模块中,并点击按钮访问它。

有使Controller B影响Controller A任何其他方式?

这里是我的代码:

app.controller("Controller A", function($scope, $http){}); 

app.directive("Navigation", [function(){ 
return { 
    restrict: "E", 
    templateUrl: "navigation.html" 
}; 
    }]) 
.controller("Controller B", function($scope, $http){}); 

谢谢。

+0

,为什么你没有在你的'控制器A'使用'Navigation'指令直接 –

+0

是'控制器B'不是指令的一部分的。你可以让你的指令需要'ngModel',这样它可以直接设置值。 – TonyGW

+0

我试图让这一个在掠夺者,似乎并没有工作:( http://plnkr.co/edit/eKiO3HF8AZkw1vktOr9C –

回答

0

如果你需要这样的事情,对不相关的领域,你可以使用服务,或自定义事件。 幸运的是,使用自定义事件很容易。

updated your plunk展示如何这是可能的。这是关键:

在你的指令,你这样做。使用$ rootScope确保事件到达您的整个应用程序。

$rootScope.$broadcast('navClick','data send') 

然后,你需要听它,你做这样的事情:

$scope.$on('navClick', function(ev,data) {console.log(data)}) 

使用这种技术人烟稀少。过度使用这使得很难遵循应用程序中的逻辑。

0

你可以使用你的指令的回调函数将由该指令的控制器,只要你有一些数据被调用来传递:

app.directive("navigation", [function() { 
    return { 
     restrict: "E", 
     cb: '&cb', 
     templateUrl: "navigation.html" 
    }; 
}]) 
.controller("Controller B", function($scope, $http) { 
    // Invoke the callback function passed to the directive 
    // Of course this call can happen at any time of this 
    // directive controller lifecycle 
    $scope.cb('some data to pass to the callback function'); 
}); 

,然后在已呈现的指令控制器定义这个回调函数:

app.controller("Controller A", function($scope, $http) { 
    $scope.callback = function(someData) { 
     alert(someData); 
    }; 
}); 

将渲染指令时传递:

<div ng-navigation cb="callback"></div> 

现在指令控制器可以将信息传递给呈现指令的原始控制器。

+0

说实话,我真的不明白的理由背后有' '当使用'='很容易的引用时,case case能够工作 – charlietfl

+0

嗯,实际上不同之处在于'='表示一个对象,而'&'表示一个函数。我最初的意图是让一个指令接受一个函数作为参数。 –

+0

你是对的,对象可以定义可以被指令调用的函数。我认为有两个不同的概念使得它对指令接受的参数有一点更明确。否则,您需要阅读指令的代码,以便了解如何在传递对象上命名该函数以便被调用。通过使用2个独立的构造,只需查看指令定义即可清除。 –