Angular.js: является ли .value () правильным способом установки широкой константы приложения и способа ее получения в контроллере

87

Привет, я смотрел пару видеороликов angular.js и увидел, что метод value () использовался для установки своего рода постоянной для всего модуля. например, можно настроить конфигурацию библиотеки Angular-UI следующим образом: (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, которая соответствует модулю приложения.

Я читал здесь на ST и в группе google angularjs, что один из способов поделиться общим кодом контроллеров btwn - через службу, будет ли эта концепция применяться здесь тоже?

Благодарность!

Ник Со
источник
3
Если вы не в курсе, служба $ http имеет некоторые возможности CSRF. См. Раздел «Защита от подделки межсайтовых запросов (XSRF)» здесь: docs.angularjs.org/api/ng.$http
Марк Райкок,

Ответы:

147

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
    });
Бен Леш
источник
4
как токен myService вписывается в картину?
Дэйв Эдельхарт,
1
@DaveEdelhart, извини, я не видел твоего вопроса раньше. Я просто использовал это как пример службы, которая использовала это значение. К счастью, Павел Глобиль - добрый самаритянин, и он добавил в мой код аннотацию, чтобы было понятнее.
Бен Леш
2
Нет, это не только для чтения. Если бы вы поместили туда объект, что угодно могло бы изменить свойства этого объекта. В основном это связано с тем, что это JavaScript, а не из-за каких-либо особых проблем с дизайном со стороны Angular. Однако я не видел, чтобы значение использовалось таким образом, чтобы оно изменялось, обычно я просто видел, как оно используется для вводимых «констант».
Бен Леш
2
Однако константы НЕ неизменны. Вы просто не можете перезаписать их другой инъекцией, потому что $ provide не перехватит их для украшения.
Бен Леш
2
Я знаю, что это старый ответ, но «Module.value (ключ, значение) используется для ввода редактируемого значения, Module.constant (key, value) используется для ввода постоянного значения» не совпадает с ng в его последнее воплощение (1.3.4). Разница между module.value () и module.constant () заключается в следующем: константа () доступна раньше в жизненном цикле вашего приложения (во время настройки и запуска); value () доступен только во время выполнения. Являются ли они изменяемыми и видны ли измененные значения, зависит от структуры их значений (примитивная или нет). docs.angularjs.org/guide/providers#constant-recipe
lukkea
4

Недавно я хотел использовать эту функцию с Karma в тесте. Как указывает Дэн Дойон, ключ в том, что вы должны вводить значение точно так же, как контроллер, служба и т. Д. Вы можете установить .value для множества различных типов - строк, массивов объектов и т. Д. Например:

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 - возможно, это файл спецификации Jasmine, загруженный Karma

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);
    });
});
SnapShot
источник
2

Вам нужно указать csrfв своем контроллереIndexUsersCtrl = ( $scope, csrf )

IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
Дэн Дойон
источник