Cześć, oglądałem kilka filmów angular.js i zauważyłem, że metoda value () została użyta do ustawienia stałej dla całego modułu. na przykład można ustawić konfigurację biblioteki Angular-UI w następujący sposób: (coffeescript)
angular.module('app',[])
.value "ui.config",
tinymce:
theme: 'simple'
width: '500'
height: '300'
A moja aplikacja wygląda obecnie tak:
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']
Ale wydaje mi się, że nie mogę uzyskać tej wartości, dotykając zmiennej „app”, która odpowiada modułowi aplikacji.
Czytałem tutaj w ST i dalej w grupie Google angularjs, że jednym ze sposobów udostępniania wspólnego kodu między kontrolerami jest usługa, czy ta koncepcja będzie miała zastosowanie również tutaj?
Dzięki!
javascript
angularjs
Nik So
źródło
źródło
Odpowiedzi:
Module.value(key, value)
służy do wstawiania edytowalnej wartości,Module.constant(key, value)
służy do wprowadzania stałej wartościRóżnica między nimi nie polega na tym, że „nie można edytować stałej”, chodzi raczej o to, że nie można przechwycić stałej za pomocą $ dostarczyć i wstrzyknąć coś innego.
// 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 });
źródło
Niedawno chciałem użyć tej funkcji z Karmą w teście. Jak zauważa Dan Doyon, kluczem jest to, że należy wstrzyknąć wartość, tak jak kontroler, usługa itp. Możesz ustawić .value na wiele różnych typów - ciągi, tablice obiektów itp. Na przykład:
myvalues.js plik zawierający wartość - upewnij się, że znajduje się on w Twoim pliku konfiguracyjnym karmy
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 - być może jest to plik specyfikacji Jasmine załadowany przez Karmę
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); }); });
źródło
Musisz odwołać się
csrf
do swojego kontroleraIndexUsersCtrl = ( $scope, csrf )
IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
źródło