Angular.js: .value (), uygulama genelinde sabit ayarlamanın ve bir denetleyicide nasıl alınacağının uygun yoludur


87

Merhaba, birkaç angular.js videosunu izliyordum ve value () yönteminin bir tür modül çapında sabit ayarlamak için kullanıldığını gördüm. örneğin, Angular-UI kitaplığının yapılandırması şu şekilde ayarlanabilir: (coffeescript)

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

Ve uygulamam şu anda şöyle görünüyor:

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']

Ancak, uygulama modülüne karşılık gelen 'uygulama' değişkenine dokunarak bu değeri elde edemiyorum.

Burada ST'de ve angularjs'in google grubunda btwn denetleyicileri ortak kodu paylaşmanın bir yolunun bir hizmet aracılığıyla olduğunu okudum, bu kavram burada da geçerli olacak mı?

Teşekkürler!


3
Farkında değilseniz, $ http hizmetinin bazı CSRF yetenekleri vardır. "Çapraz Site Talep Sahteciliği (XSRF) Koruması" bölümüne bakın: docs.angularjs.org/api/ng.$http
Mark Rajcok

Yanıtlar:


147

Module.value(key, value)düzenlenebilir bir değer enjekte etmek için Module.constant(key, value)kullanılır, sabit bir değer enjekte etmek için kullanılır

İkisi arasındaki fark, "bir sabiti düzenleyemeyeceğiniz" kadar çok değil, daha çok, bir sabiti $ allow ile kesip başka bir şey enjekte edemezsiniz.

// 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' belirteci resme nasıl uyuyor?
Dave Edelhart

1
@DaveEdelhart, Maalesef sorunuzu daha önce görmedim. Değeri kullanan bir hizmet örneği olarak oraya koydum. Neyse ki, Pavel Hlobil iyi bir Samaritan ve bunu daha açık hale getirmek için koduma bazı açıklamalar ekledi.
Ben Lesh

2
Hayır, "salt okunur" değil. Oraya bir nesne koyarsanız, herhangi bir şey o nesnenin özelliklerini değiştirebilir. Bunun nedeni çoğunlukla JavaScript olması ve Angular'ın herhangi bir özel tasarım endişesi değil. Ancak, değerin değiştirilecek şekilde kullanıldığını görmedim, genellikle sadece enjekte edilebilir "sabitler" için kullanıldığını gördüm.
Ben Lesh 13

2
Ancak sabitler değişmez DEĞİLDİR. Başka bir enjeksiyonla bunların üzerine yazamazsınız, çünkü $ allow onları dekorasyon için engellemeyecektir.
Ben Lesh

2
Bunun eski bir cevap olduğunu biliyorum, ancak "Module.value (anahtar, değer) düzenlenebilir bir değer enjekte etmek için kullanılır, Module.constant (anahtar, değer) sabit bir değer enjekte etmek için kullanılır" en son enkarnasyon (1.3.4). Module.value () ve module.constant () arasındaki fark şudur: uygulamanızın yaşam döngüsünde (yapılandırma ve çalıştırma sırasında) bir sabit () kullanılabilir; değer () yalnızca çalıştırma sırasında kullanılabilir. Değişken olup olmadıkları ve değiştirilen değerlerin nerede göründüğü, değerlerinin yapısına (ilkel veya değil) bağlıdır. docs.angularjs.org/guide/providers#constant-recipe
lukkea

4

Son zamanlarda bu özelliği Karma ile bir test içinde kullanmak istedim. Dan Doyon'un işaret ettiği gibi anahtar, tıpkı bir denetleyici, hizmet vb. Gibi bir değer enjekte etmenizdir. Değerini birçok farklı türe (dizeler, nesne dizileri vb.) Ayarlayabilirsiniz.

myvalues.js değer içeren bir dosya - karma conf dosyanıza dahil edildiğinden emin olun

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 - belki bu Karma tarafından yüklenen bir Jasmine spec dosyasıdır

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

csrfDenetleyicinize başvurmanız gerekirIndexUsersCtrl = ( $scope, csrf )

IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.