Angularjs:$scope.emit 不工作
Angularjs: $scope.emit is not working
我是 angularjs
的新手,我正在创建一个 Web 应用程序来积累经验和练习。我遇到的问题是 $scope.$emit
似乎不起作用,我正在寻找在控制器之间联系功能的方法,到目前为止我在互联网上发现 $scope.emit
和 $scope.on
似乎为了适应这种任务,如果有另一种方法,我想知道,反正代码是这样写的:
loginController.js
(function(angular)
{
var app = angular.module('Organizer');
// inject $scope to the controller in order to try $scope.$emit
app.controller('login', function($http, $scope)
{
// i define the scope like this so i can access inside other functions
var scope = this;
scope.processing = false;
scope.message = null;
scope.submit = function()
{
scope.processing = true;
// store data for post
var post = {
username: scope.username,
password: scope.password
};
// send post data
$http.post('api/default/login', post).
success(function(data, status)
{
// hide processing feedback and show the result
scope.processing = false;
scope.message = data.message;
}).
error(function(data, status)
{
scope.processing = false;
});
};
// Function i use to emit
this.closeDialog = function()
{
$scope.$emit('closeDialog');
};
});
})(angular);
siteController.js
(function(angular)
{
var app = angular.module('Organizer');
app.controller('site', function($mdDialog, $scope)
{
this.menu = ['test1', 'test2'];
this.dialog = function()
{
$mdDialog.show({
templateUrl: 'site/login',
});
};
// this does not seem to be working
$scope.$on('closeDialog', function(event)
{
console.log('close dialog');
});
});
})(angular);
注意: 我正在使用 angular material 你可以看到我正在显示一个对话框,它是一个登录,登录有它的控制器(我希望它使用同一个站点控制器,但我不知道怎么做)并且这个对话框有一个按钮调用 loginControler 中的函数 closeDialog()
并且应该关闭对话框,但是现在出于测试原因我只是记录它是否正在调用事件
$emit 函数仅将事件传播到作用域父级。
$broadcast 函数将事件传播到作用域子项。
所以你需要什么取决于控制器如何使用它...
如果你想让一个事件到达你必须使用 $rootScope 的所有应用程序:
$rootScope.$broadcast('myEvent');
Here you have the doc of the scope, include $emit and $broadcast
您无法在对话控制器中发出或广播,因为 angular material 中的对话具有隔离范围。因此,当您发出或广播一个事件时,它不会去任何地方。 $emit 和 $broadcast 仅在您具有范围层次结构时才有效。 $emit 在层次结构中向上传播事件,而 $broadcast 在层次结构中向下传播事件。
我是 angularjs
的新手,我正在创建一个 Web 应用程序来积累经验和练习。我遇到的问题是 $scope.$emit
似乎不起作用,我正在寻找在控制器之间联系功能的方法,到目前为止我在互联网上发现 $scope.emit
和 $scope.on
似乎为了适应这种任务,如果有另一种方法,我想知道,反正代码是这样写的:
loginController.js
(function(angular)
{
var app = angular.module('Organizer');
// inject $scope to the controller in order to try $scope.$emit
app.controller('login', function($http, $scope)
{
// i define the scope like this so i can access inside other functions
var scope = this;
scope.processing = false;
scope.message = null;
scope.submit = function()
{
scope.processing = true;
// store data for post
var post = {
username: scope.username,
password: scope.password
};
// send post data
$http.post('api/default/login', post).
success(function(data, status)
{
// hide processing feedback and show the result
scope.processing = false;
scope.message = data.message;
}).
error(function(data, status)
{
scope.processing = false;
});
};
// Function i use to emit
this.closeDialog = function()
{
$scope.$emit('closeDialog');
};
});
})(angular);
siteController.js
(function(angular)
{
var app = angular.module('Organizer');
app.controller('site', function($mdDialog, $scope)
{
this.menu = ['test1', 'test2'];
this.dialog = function()
{
$mdDialog.show({
templateUrl: 'site/login',
});
};
// this does not seem to be working
$scope.$on('closeDialog', function(event)
{
console.log('close dialog');
});
});
})(angular);
注意: 我正在使用 angular material 你可以看到我正在显示一个对话框,它是一个登录,登录有它的控制器(我希望它使用同一个站点控制器,但我不知道怎么做)并且这个对话框有一个按钮调用 loginControler 中的函数 closeDialog()
并且应该关闭对话框,但是现在出于测试原因我只是记录它是否正在调用事件
$emit 函数仅将事件传播到作用域父级。
$broadcast 函数将事件传播到作用域子项。
所以你需要什么取决于控制器如何使用它...
如果你想让一个事件到达你必须使用 $rootScope 的所有应用程序:
$rootScope.$broadcast('myEvent');
Here you have the doc of the scope, include $emit and $broadcast
您无法在对话控制器中发出或广播,因为 angular material 中的对话具有隔离范围。因此,当您发出或广播一个事件时,它不会去任何地方。 $emit 和 $broadcast 仅在您具有范围层次结构时才有效。 $emit 在层次结构中向上传播事件,而 $broadcast 在层次结构中向下传播事件。