我有一些服务器端枚举,正在发送到一个有角度的应用程序。
理想情况下,我希望能够访问这种行为的枚举:
<select ng-options="type.name as type.value for type in Enums.TYPES" />
我已经尝试了几种方法来实现这一点:
angular.module('myModule').constant('Enums', {myEnumObject})
var Enums = {myEnumObject};
$window.Enums = {myEnumObject};
显然,这些方法都无法从视图中访问对象。我也尝试过使用服务来返回对象,但这并不能使它从视图中访问。
我的问题是,我知道这可以从范围内完成,使用其中一个:
$rootScope.Enums = {myEnumObject};
OR
$scope.Enums = {myEnumObject};
我对此感到担忧的是,这似乎是不可持续的。使用作用域似乎是一种糟糕的做法,因为创建的每个子作用域都会被这些数据污染。
我也可以通过将枚举分配给控制器来实现,但这似乎有点违背了拥有这些全局对象的目的。事实上,它们是永远不变的常数。
我好像在这里错过了什么。有人能为我指明正确的方向来维护这个代码的可持续性,并以"有角度"的方式处理它吗。谢谢
避免将常量或服务枚举附加到所需的每个作用域的一种方法是对应用程序进行以指令为中心的设计。由于指令可以具有独立的作用域,因此可以将视图/控制器和作用域绑定捆绑在一个漂亮的可重用包中。例如:
.directive('SomeEnumThing', function(Enums){
return {
scope: {}, // don't forget to set an isolate scope on the directive
templateUrl: 'sometpl.html',
link: function(scope, elem, attrs){
// bind the enums to your directive's scope
scope.enums = Enums;
}
};
});
这种方法的唯一缺点是编写指令时过于冗长(但最终更具可重用性),以及设置与外部对象的任何其他必要绑定的额外要求(因为您现在处于通用范围层次结构之外)。
你可以做:
angular.module('myModule').constant('Enums', {myEnumObject})
然后在任何范围内,你想使用它,你可以
$scope.Enums = Enums;
这并不是很污染,只有在需要的范围内才会设置。
全局常数可以放在$rootScope
上,这可以被视为污染。但是,如果这是你在各种指令中整个应用程序都需要的东西,那就没什么大不了的了(IMO)。这个问题没有正确的答案。