Angular.js:.value()是设置应用程序广泛常量的正确方法,以及如何在控制器中检索它

您好,我正在观看一些angular.jsvideo,看到value()方法被用来设置一种模块范围的常量。 例如,可以像这样设置Angular-UI库的configuration:(coffeescript)

angular.module('app',[]) .value "ui.config", tinymce: theme: 'simple' width: '500' height: '300' 

而我的应用程序目前看起来像这样:

 window.app = angular.module("app", [ 'ui']) .config(["$routeProvider", ($routeProvider) -> $routeProvider .when "/users", templateUrl: "assets/templates/users/index.html" controller: IndexUsersCtrl .otherwise redirectTo: "/users" ]) .value 'csrf', $('meta[name="csrf-token"]').attr('content') #<---- attention here IndexUsersCtrl = ($scope) -> $scope.users = gon.rabl console.log "I want to log the csrf value here" #<---- then attention IndexUsersCtrl.$inject = ['$scope'] 

但我似乎无法通过点击与app模块对应的“app”variables来获得该值。

我在这里读到ST和angularjs的谷歌组合,共享代码btwn控制器的一种方法是通过服务,这个概念也适用于这里吗?

谢谢!

Module.value(key, value)用于注入一个可编辑的值, Module.constant(key, value)用于注入一个常量值

两者之间的区别并不是说你“不能编辑一个常量”,而是更多的是你不能用$ provide拦截一个常量而注入其他东西。

 // define a value app.value('myThing', 'weee'); // define a constant app.constant('myConst', 'blah'); // use it in a service app.factory('myService', ['myThing', 'myConst', function(myThing, myConst){ return { whatsMyThing: function() { return myThing; //weee }, getMyConst: function () { return myConst; //blah } }; }]); // use it in a controller app.controller('someController', ['$scope', 'myThing', 'myConst', function($scope, myThing, myConst) { $scope.foo = myThing; //weee $scope.bar = myConst; //blah }); 

我最近想在testing里面用Karma来使用这个特性。 正如Dan Doyon所指出的那样,关键在于你可以像控制器,服务等一样注入一个值。你可以设置.value多种不同的types – string,对象数组等等。例如:

myvalues.js包含值的文件 – 确保它包含在你的karma conf文件中

 var myConstantsModule = angular.module('test.models', []); myConstantModule.value('dataitem', 'thedata'); // or something like this if needed myConstantModule.value('theitems', [ {name: 'Item 1'}, {name: 'Item 2'}, {name: 'Item 3'} ]); 

]);

test / spec / mytest.js – 也许这是一个由Karma加载的Jasmine spec文件

 describe('my model', function() { var theValue; var theArray; beforeEach(module('test.models')); beforeEach(inject(function(dataitem,theitems) { // note that dataitem is just available // after calling module('test.models') theValue = dataitem; theArray = theitems; }); it('should do something',function() { // now you can use the value in your tests as needed console.log("The value is " + theValue); console.log("The array is " + theArray); }); }); 

你需要在你的控制器中引用csrf IndexUsersCtrl = ( $scope, csrf )

 IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]