我想为我的控制器逻辑引入一些enum用于某些类型的安全性,所以例如我创建了这样的东西:
var app = angular.module('myApp', []);
var StateEnum = Object.freeze({"login":1, "logout":2})
function LoginCheckCtrl($scope) {
$scope.stateEnum = StateEnum
$scope.loginData = StateEnum.login
$scope.login = function() {
console.log($scope.loginData ? 'logged in' : 'not logged in');
$scope.loginData = StateEnum.logout;
};
$scope.logout = function() {
console.log($scope.loginData ? 'logged in' : 'not logged in');
$scope.loginData = StateEnum.login;
};
}
在我的示例页面中我会有这样的事情:
<div ng-controller="LoginCheckCtrl">
<div ng-switch on="loginData">
<div ng-switch-when="stateEnum.login" ng-include="'login'"></div>
<div ng-switch-when="stateEnum.logout" ng-include="'logout'"></div>
</div>
</div>
<script type="text/ng-template" id="login">
<button ng-click="login()">Login</button>
</script>
<script type="text/ng-template" id="logout">
<button ng-click="logout()">Logout</button>
</script>
但是ng-switch-when
不想工作。它只有在我用ng-swith-when
手动用整数替换值时才有效,例如1,2。
以下是展示这一点的小提琴:
现在,正如您所看到的,第一个显然不起作用,第二个起作用 - 意味着当单击按钮时它会更改按钮。
我认为这个问题是var StateEnum = Object.freeze({"login":1, "logout":2})
。
是否可以在我的HTML中使用我的枚举,以便ng-switch-when
能够正常工作(如第二小提琴)?
答案 0 :(得分:13)
我想我会创建一个可以包含所有枚举的服务:
angular.module('Enums', []).
factory('Enum', [ function () {
var service = {
freeze: {login:1, logout:2 },
somethingelse: {abc:1,def:2}
};
return service;
}]);
您的应用定义如下:
var app = angular.module('myApp', ['Enums']);
然后您的控制器可以在需要时注入它们:
function LoginCheckCtrl($scope, Enum) {
if (1==Enum.freeze.login) // as an example
if (1==Enum.somethingelse.abc) // another example
服务是单身,所以这有效地为您提供了一组您可以定义的枚举。
至于指令时的ngSwitch,我认为它需要一个字符串(如果我错了,请纠正我)。一对夫妇参考:
https://groups.google.com/forum/?fromgroups#!topic/angular/EH4W0y93ZAA https://github.com/angular/angular.js/blob/master/src/ng/directive/ngSwitch.js#L171
实现目标的另一种方法是使用ng-show
/ ng-hide
<div ng-include="'login'" ng-show='stateEnum.login==loginData' ...>
答案 1 :(得分:5)
这是一个如何使用Angular使用标准JavaScript和BootStrap模拟枚举的真实示例。这是为了显示也称为票证的订单的详细信息。
将您的枚举定义为Angular常量:
app = angular.module("MyApp", [])
.constant('ENUMS',
{
TicketStatusText: { 0: 'Open', 3: 'Ready', 1: 'Closed', 2: 'Overring' },
TicketStatus: {Open:0, Ready:3, Closed:1, Overring:2}
}
)
您的控制器代码应如下所示:
app.controller("TicketsController", function ($scope, $http, ENUMS) {
$scope.enums = ENUMS;
使用BootStrap的HTML看起来应该是这样的:
<table>
<tr ng-repeat="ticket in tickets" ng-class="{danger:ticket.CurrentStatus==enums.TicketStatus.Overring}">
<td>
<strong>{{ticket.TransNumber}}</strong>
</td>
<td>
{{enums.TicketStatusText[ticket.CurrentStatus]}}
</td>
注意在ng-class中结合BootStrap,我们将票证模型的当前状态与enums.TicketStatusText.Overring进行比较;这将改变任何具有Overring状态(2)的票证的行颜色。
同样在其中一列中,我们希望将票证状态显示为字符串而不是整数。所以使用它:{{enums.TicketStatusText [ticket.CurrentStatus]}}
答案 2 :(得分:2)
您是否在stackoverflow上查看了这个答案?: Ways to enum
最佳答案是从2008年开始,所以请查看更新/最新的帖子以获取线索。当我读到它们时,你可以得到你需要的任何原语的答案,但我还没有测试过。任何人都可以从这篇文章中建议一个与Angular一起使用的最佳答案吗?
答案 3 :(得分:1)
我建议使用angular.Module.constant
。例如:
var app = angular.module('app', []);
app.constant('Weekdays', {
Monday: 1,
Tuesday: 2,
Wednesday: 3,
Thursday: 4,
Friday: 5,
Saturday: 6,
Sunday: 7
});
app.controller('TestController', function(Weekdays) {
this.weekday = Weekdays.Monday;
});
答案 4 :(得分:0)
我在一个名为Enums的单独文件中声明了一些枚举。 (我使用TypeScript制作)在角度应用程序的控制器中我有这样的东西:
var app = angular.module("Sample", ["ngAnimate"])
app.controller("Messages", function ($scope, $sce, $interval, $log, $http) {
$scope.enums = Enums;
};
另一个文件中的枚举位于名为Enums的var中。
现在你可以使用它,甚至更有创意:
ng-show="anotherVAr == enums.enumOne.VALUE"
答案 5 :(得分:0)
服务
var app = angular.module('myApp', []);
app.factory('Enum', function () {
return {
Action: {login:1, logout:2 },
Status: {open:1, close:2}
};
});
<强>控制器强>
app.controller('TestController', function($scope, Enum) {
$scope.x = Enum.Action.logout;
$scope.y= Enum.Status.close;
});
答案 6 :(得分:0)
ng-switch-when不支持表达式,需要一个字符串或数字。 打字稿编译器可以在字符串和数字之间创建反向映射,以使stateEnum [1] ='login'符合您的情况(或者您可以使用实用程序功能自行创建)。 因此,您可以简单地执行此操作,虽然有点难看但很干净。
<div ng-controller="LoginCheckCtrl">
<div ng-switch on="stateEnum[loginData]">
<div ng-switch-when="login" ng-include="'login'"></div>
<div ng-switch-when="logout" ng-include="'logout'"></div>
</div>
</div>