Angular.js: Is .value () cara yang tepat untuk menyetel konstanta lebar aplikasi dan cara mengambilnya di pengontrol

87

Halo, saya menonton beberapa video angular.js dan melihat bahwa metode value () digunakan untuk mengatur semacam konstanta lebar modul. misalnya, seseorang dapat menyetel konfigurasi pustaka Angular-UI seperti ini: (coffeescript)

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

Dan aplikasi saya saat ini terlihat seperti ini:

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

Tapi sepertinya saya tidak bisa mendapatkan nilai itu dengan mengetuk variabel 'app' yang sesuai dengan modul aplikasi.

Saya membaca di sini di ST dan seterusnya di grup google angularjs bahwa salah satu cara untuk berbagi kode umum pengontrol btwn adalah melalui layanan, apakah konsep ini akan berlaku di sini juga?

Terima kasih!

Nik So
sumber
3
Jika Anda tidak menyadarinya, layanan $ http memiliki beberapa kemampuan CSRF. Lihat bagian "Perlindungan Cross Site Request Forgery (XSRF)" di sini: docs.angularjs.org/api/ng.$http
Mark Rajcok

Jawaban:

147

Module.value(key, value)digunakan untuk memasukkan nilai yang dapat diedit, Module.constant(key, value)digunakan untuk memasukkan nilai konstan

Perbedaan antara keduanya tidak terlalu banyak sehingga Anda "tidak dapat mengedit konstanta", tetapi lebih karena Anda tidak dapat mencegat konstanta dengan $ sediakan dan menyuntikkan sesuatu yang lain.

// 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
    });
Ben Lesh
sumber
4
bagaimana token 'myService' cocok dengan gambar?
Dave Edelhart
1
@DaveEdelhart, Maaf saya tidak melihat pertanyaan Anda sebelumnya. Saya baru saja memilikinya di sana sebagai contoh layanan yang menggunakan nilai tersebut. Untungnya, Pavel Hlobil adalah orang Samaria yang baik dan dia menambahkan beberapa penjelasan ke kode saya untuk membuatnya lebih jelas.
Ben Lesh
2
Tidak, ini bukan "hanya baca". Jika Anda meletakkan sebuah objek di sana, apa pun dapat mengubah properti objek tersebut. Ini sebagian besar karena itu JavaScript, dan bukan karena masalah desain tertentu di bagian Angular. Namun, saya belum melihat nilai yang digunakan dengan cara yang diubah, biasanya saya baru saja melihatnya digunakan untuk "konstanta" yang dapat diinjeksi.
Ben Lesh
2
Namun konstanta TIDAK dapat diubah. Anda tidak bisa menimpanya dengan injeksi lain karena $ sediakan tidak akan mencegatnya untuk dekorasi.
Ben Lesh
2
Saya tahu ini adalah jawaban lama, tetapi "Module.value (key, value) digunakan untuk memasukkan nilai yang dapat diedit, Module.constant (key, value) digunakan untuk memasukkan nilai konstan" tidak cocok dengan ng di dalamnya inkarnasi terbaru (1.3.4). Perbedaan antara module.value () dan module.constant () adalah: konstanta () tersedia lebih awal dalam siklus hidup aplikasi Anda (selama config dan run); value () hanya tersedia selama dijalankan. Apakah mereka bisa berubah, dan di mana nilai yang berubah terlihat, tergantung pada struktur nilainya (primitif atau tidak). docs.angularjs.org/guide/providers#constant-recipe
lukkea
4

Saya baru-baru ini ingin menggunakan fitur ini dengan Karma di dalam tes. Seperti yang ditunjukkan Dan Doyon, kuncinya adalah Anda akan memasukkan nilai seperti pengontrol, layanan, dll. Anda dapat menyetel .value ke berbagai jenis - string, array objek, dll. Misalnya:

myvalues.js file yang berisi nilai - pastikan itu termasuk dalam file conf karma Anda

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 - mungkin ini adalah file spesifikasi Jasmine yang dimuat oleh 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);
    });
});
Foto
sumber
2

Anda perlu merujuk csrfpada pengontrol AndaIndexUsersCtrl = ( $scope, csrf )

IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
Dan Doyon
sumber