我使用angular是非常新的,当涉及到范围时,我不知道在控制器之间共享功能的最佳方式是什么(在其他情况下,我理解解决方案是创建服务。)
我已经为两个可能的解决方案写了一个jsfiddle,但我不相信任何一个:
http://jsfiddle.net/zemogc/LQ59p/
该示例包括显示具有特定类型的消息。在示例中,消息和类型由表单给出(按钮上的deppending称为soution或其他),但在我的应用程序中,将会有许多不同页面中的许多控制器可以显示消息(以及消息div)将包含在ng-include中)所以我以两种不同的方式创建了一个名为ManageMessage的函数:
$scope.changeMessageService = function (messageText, messageType){
ManageMessage.set($scope, messageText, messageType);
};
$scope.changeMessageController = function (messageText, messageType) {
$scope.message = messageText;
$scope.messageType = messageType;
$controller('ManageMessageCtrl', {
$scope: $scope
});
};
那么实现ManageMessage从不同控制器使用的最佳方法是什么? (现在我问一个具体问题,但我的问题是通用的,我试着在标题中恢复它。)
如果我的英语不好,请提前致谢并表示歉意。
答案 0 :(得分:1)
对于此问题,我建议将status
与$scope
分开。所以,想法是这样设计:
<强> statusService.js 强>:
angular.module('app').factory('statusService', [function() {
return {
getStatus: function(messageType) {
status = {}; // could set some defaults here
switch (messageType) {
case 'error':
status.isOk = false;
status.isLoading = false;
status.isError = true;
status.noMessage = false;
break;
case 'ok':
status.isOk = true;
status.isLoading = false;
status.isError = true;
status.noMessage = false;
break;
case 'loading':
status.isOk = false;
status.isLoading = true;
status.isError = false;
status.noMessage = false;
break;
case 'none':
status.message = '';
status.noMessage = true;
break;
}
return status;
}
}
}]);
<强>控制器强>:
myAppControllers.controller('ManageMessageCtrl', ['$scope', 'statusService', function ($scope, statusService) {
if ($scope.message === '') {
$scope.messageType = 'none';
}
var status = statusService.getStatus($scope.messageType);
$scope.isOk = status.isOk;
$scope.isLoading = status.isLoading;
$scope.isError = status.isError;
$scope.noMessage = status.noMessage;
$scope.message = status.message;
}]);