Angular.js: Является ли .value() правильным способом установки постоянной константы приложения и как ее получить в контроллере
Привет, я смотрел пару видеороликов 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 group, что один из способов совместного использования общих контроллеров btwn кода - через сервис, будет ли эта концепция применяться и здесь?
Спасибо!
Ответы
Ответ 1
Module.value(key, value)
используется для ввода редактируемого значения,
Module.constant(key, value)
используется для ввода постоянного значения
Разница между двумя заключается не столько в том, что вы "не можете редактировать константу", это больше, что вы не можете перехватывать константу с помощью $provision и вводить что-то еще.
// 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
});
Ответ 2
Недавно я хотел использовать эту функцию с кармой внутри теста. Как указывает Дэн Дойон, ключ заключается в том, что вы вводите значение точно так же, как контроллер, сервис и т.д. Вы можете установить значение для разных типов: строки, массивы объектов и т.д. Например:
myvalues.js файл, содержащий значение - убедитесь, что он включен в ваш файл конфигурации кармы
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);
});
});
Ответ 3
Вам нужно указать csrf
в вашем контроллере IndexUsersCtrl = ( $scope, csrf )
IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]