如何将我的$scope对象从一个控制器发送到另一个使用。$emit和。$on方法?
function firstCtrl($scope) {
$scope.$emit('someEvent', [1,2,3]);
}
function secondCtrl($scope) {
$scope.$on('someEvent', function(mass) { console.log(mass); });
}
这不是我想的那样。$emit和$on如何工作?
如何将我的$scope对象从一个控制器发送到另一个使用。$emit和。$on方法?
function firstCtrl($scope) {
$scope.$emit('someEvent', [1,2,3]);
}
function secondCtrl($scope) {
$scope.$on('someEvent', function(mass) { console.log(mass); });
}
这不是我想的那样。$emit和$on如何工作?
当前回答
<!DOCTYPE html>
<html>
<head>
<script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script>
var app = angular.module('MyApp',[]);
app.controller('parentCtrl',function($scope){
$scope.$on('MyEvent',function(event,data){
$scope.myData = data;
});
});
app.controller('childCtrl',function($scope){
$scope.fireEvent = function(){
$scope.$emit('MyEvent','Any Data');
}
});
</script>
</head>
<body ng-app="MyApp">
<div ng-controller="parentCtrl" ng-model="myName">
{{myData}}
<div ng-controller="childCtrl">
<button ng-click="fireEvent()">Fire Event</button>
</div>
</div>
</body>
</html>
其他回答
你必须使用$rootScope在同一个应用程序的控制器之间发送和捕获事件。下面是一个工作示例。
app.controller('firstCtrl', function($scope, $rootScope) {
function firstCtrl($scope) {
{
$rootScope.$emit('someEvent', [1,2,3]);
}
}
app.controller('secondCtrl', function($scope, $rootScope) {
function secondCtrl($scope)
{
$rootScope.$on('someEvent', function(event, data) { console.log(data); });
}
}
链接到$scope对象的事件只在所有者控制器中工作。控制器之间的通信是通过$rootScope或Services完成的。
下面的代码显示了两个子控制器,事件从它们向上分派到父控制器(rootScope)
<body ng-app="App">
<div ng-controller="parentCtrl">
<p>City : {{city}} </p>
<p> Address : {{address}} </p>
<div ng-controller="subCtrlOne">
<input type="text" ng-model="city" />
<button ng-click="getCity(city)">City !!!</button>
</div>
<div ng-controller="subCtrlTwo">
<input type="text" ng-model="address" />
<button ng-click="getAddrress(address)">Address !!!</button>
</div>
</div>
</body>
var App = angular.module('App', []);
// parent controller
App.controller('parentCtrl', parentCtrl);
parentCtrl.$inject = ["$scope"];
function parentCtrl($scope) {
$scope.$on('cityBoom', function(events, data) {
$scope.city = data;
});
$scope.$on('addrBoom', function(events, data) {
$scope.address = data;
});
}
// sub controller one
App.controller('subCtrlOne', subCtrlOne);
subCtrlOne.$inject = ['$scope'];
function subCtrlOne($scope) {
$scope.getCity = function(city) {
$scope.$emit('cityBoom', city);
}
}
// sub controller two
App.controller('subCtrlTwo', subCtrlTwo);
subCtrlTwo.$inject = ["$scope"];
function subCtrlTwo($scope) {
$scope.getAddrress = function(addr) {
$scope.$emit('addrBoom', addr);
}
}
http://jsfiddle.net/shushanthp/zp6v0rut/
首先,亲子范围关系确实很重要。你有两种可能触发事件:
$broadcast——向下分派事件到所有子作用域, $emit——通过作用域层次结构向上分派事件。
我对你的控制器(作用域)关系一无所知,但有几个选项:
If scope of firstCtrl is parent of the secondCtrl scope, your code should work by replacing $emit by $broadcast in firstCtrl: function firstCtrl($scope) { $scope.$broadcast('someEvent', [1,2,3]); } function secondCtrl($scope) { $scope.$on('someEvent', function(event, mass) { console.log(mass); }); } In case there is no parent-child relation between your scopes you can inject $rootScope into the controller and broadcast the event to all child scopes (i.e. also secondCtrl). function firstCtrl($rootScope) { $rootScope.$broadcast('someEvent', [1,2,3]); } Finally, when you need to dispatch the event from child controller to scopes upwards you can use $scope.$emit. If scope of firstCtrl is parent of the secondCtrl scope: function firstCtrl($scope) { $scope.$on('someEvent', function(event, data) { console.log(data); }); } function secondCtrl($scope) { $scope.$emit('someEvent', [1,2,3]); }
这是我的函数:
$rootScope.$emit('setTitle', newVal.full_name);
$rootScope.$on('setTitle', function(event, title) {
if (scope.item)
scope.item.name = title;
else
scope.item = {name: title};
});
如何将我的$scope对象从一个控制器发送到另一个使用。$emit和。$on方法?
你可以在应用的层次结构中发送任何你想要的对象,包括$scope。
下面简要介绍一下广播和发射的工作原理。
注意下面的节点;都嵌套在节点3中。在这种情况下使用broadcast和emit。
注意:本例中每个节点的编号是任意的;它很容易成为第一;数字2;甚至是1348。对于这个例子,每个数字只是一个标识符。这个例子的重点是展示Angular控制器/指令的嵌套。
3
------------
| |
----- ------
1 | 2 |
--- --- --- ---
| | | | | | | |
看看这棵树。你如何回答以下问题?
注意:还有其他方法来回答这些问题,但这里我们将讨论广播和发射。此外,当阅读下面的文本时,假设每个数字都有自己的文件(指令,控制器)例如one.js, two.js, three.js。
节点1如何与节点3通信?
在文件1。js中
scope.$emit('messageOne', someValue(s));
在文件3 .js中——所有需要通信的子节点的最上面的节点。
scope.$on('messageOne', someValue(s));
节点2如何与节点3通信?
在文件two.js中
scope.$emit('messageTwo', someValue(s));
在文件3 .js中——所有需要通信的子节点的最上面的节点。
scope.$on('messageTwo', someValue(s));
节点3如何与节点1和/或节点2通信?
在文件3 .js中——所有需要通信的子节点的最上面的节点。
scope.$broadcast('messageThree', someValue(s));
在文件one.js && two.js中,你想要捕获消息的文件或两者都有。
scope.$on('messageThree', someValue(s));
节点2如何与节点1通信?
在文件two.js中
scope.$emit('messageTwo', someValue(s));
在文件3 .js中——所有需要通信的子节点的最上面的节点。
scope.$on('messageTwo', function( event, data ){
scope.$broadcast( 'messageTwo', data );
});
在文件1。js中
scope.$on('messageTwo', someValue(s));
然而
当所有这些嵌套的子节点试图像这样通信时,您将很快看到许多$on、$broadcast和$emit。
这是我喜欢做的事情。
在最上面的父节点中(在本例中是3…),这可能是你的父控制器…
在文件3。js中
scope.$on('pushChangesToAllNodes', function( event, message ){
scope.$broadcast( message.name, message.data );
});
现在,在任何子节点中,您只需要$emit消息或使用$on捕获它。
注意:通常很容易在一个嵌套路径中进行交叉对话,而不需要使用$emit、$broadcast或$on,这意味着大多数用例都是用于试图让节点1与节点2通信,反之亦然。
节点2如何与节点1通信?
在文件two.js中
scope.$emit('pushChangesToAllNodes', sendNewChanges());
function sendNewChanges(){ // for some event.
return { name: 'talkToOne', data: [1,2,3] };
}
在文件3 .js中——所有需要通信的子节点的最上面的节点。
我们已经处理过了,记得吗?
在文件1。js中
scope.$on('talkToOne', function( event, arrayOfNumbers ){
arrayOfNumbers.forEach(function(number){
console.log(number);
});
});
您仍然需要对想要捕获的每个特定值使用$on,但是现在您可以在任何节点中创建您喜欢的任何值,而不必担心在捕获和广播通用的pushChangesToAllNodes时如何通过父节点间隙获取消息。