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, Вибачте, я не бачив вашого запитання раніше. Я просто мав це там як приклад служби, яка використовувала значення. На щастя, Павло Хобіл - добрий самарянин, і він додав анотацію до мого коду, щоб зробити це зрозумілішим.
Ben Lesh

2
Ні, це не "лише для читання". Якби ви поклали туди об’єкт, будь-що може змінити властивості цього об’єкта. Це здебільшого тому, що це JavaScript, а не через якусь особливу стурбованість з боку Angular. Однак я не бачив значення, використовуваного таким чином, що воно змінюється, зазвичай я просто бачив, як воно використовується для ін'єкційних "констант".
Бен Леш,

2
Однак константи НЕ є незмінними. Ви просто не можете переписати їх іншим введенням, тому що $ provide не перехопить їх для прикраси.
Ben Lesh

2
Я знаю, що це стара відповідь, але "Module.value (ключ, значення) використовується для введення редагованого значення, Module.constant (ключ, значення) використовується для введення постійного значення" не збігається з ng у своєму останнє втілення (1.3.4). Різниця між module.value () та module.constant () полягає в тому, що: константа () доступна раніше в життєвому циклі вашого додатка (під час налаштування та запуску); value () доступне лише під час запуску. Чи вони змінні та де видимі змінені значення, залежить від структури їх значення (примітивної чи ні). docs.angularjs.org/guide/providers#constant-recipe
lukkea

4

Нещодавно я хотів використовувати цю функцію разом із Karma в тесті. Як зазначає Ден Дойон, ключовим є те, що ви вводите значення так само, як контролер, сервіс тощо. Ви можете встановити .value для багатьох різних типів - рядків, масивів об'єктів тощо. Наприклад:

myvalues.js файл, що містить значення - переконайтеся, що він включений у ваш файл конф. karma

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);
    });
});

2

Вам потрібно посилання csrfу вашому контролеріIndexUsersCtrl = ( $scope, csrf )

IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.