Angular.js: Là .value () là cách thích hợp để đặt hằng số trên toàn ứng dụng và cách truy xuất nó trong bộ điều khiển


87

Xin chào, tôi đang xem một vài video angle.js và thấy rằng phương thức value () được sử dụng để đặt một loại hằng số trên toàn mô-đun. ví dụ: người ta có thể đặt cấu hình của thư viện Angular-UI như sau: (coffeescript)

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

Và ứng dụng của tôi hiện đang trông như thế này:

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

Nhưng tôi dường như không thể nhận được giá trị đó bằng cách nhấn vào biến 'ứng dụng' tương ứng với mô-đun ứng dụng.

Tôi đã đọc ở đây trên ST và trên nhóm google của anglejs rằng một cách để chia sẻ các bộ điều khiển btwn mã phổ biến là thông qua một dịch vụ, liệu khái niệm này có áp dụng ở đây không?

Cảm ơn!


3
Trong trường hợp bạn không biết, dịch vụ $ http có một số khả năng CSRF. Xem phần "Bảo vệ yêu cầu giả mạo qua trang web (XSRF)" tại đây: docs.angularjs.org/api/ng.$http
Mark Rajcok

Câu trả lời:


147

Module.value(key, value)được sử dụng để đưa vào một giá trị có thể chỉnh sửa, Module.constant(key, value)được sử dụng để đưa vào một giá trị không đổi

Sự khác biệt giữa hai điều này không quá nhiều đến mức bạn "không thể chỉnh sửa một hằng số", mà là bạn không thể chặn một hằng số với $ cung cấp và đưa vào một thứ gì đó khác.

// 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
Làm thế nào để mã thông báo 'myService' phù hợp với hình ảnh?
Dave Edelhart

1
@DaveEdelhart, Xin lỗi, tôi không thấy câu hỏi của bạn sớm hơn. Tôi chỉ có nó trong đó như một ví dụ về một dịch vụ sử dụng giá trị. May mắn thay, Pavel Hlobil là một người Samaritan tốt và anh ấy đã thêm một số chú thích vào mã của tôi để làm rõ hơn điều đó.
Ben Lesh

2
Không, nó không phải là "chỉ đọc". Nếu bạn đặt một đối tượng vào đó, bất cứ thứ gì cũng có thể thay đổi thuộc tính của đối tượng đó. Điều này chủ yếu là bởi vì đó là JavaScript, chứ không phải vì bất kỳ mối quan tâm thiết kế cụ thể nào đối với Angular. Tuy nhiên, tôi chưa thấy giá trị được sử dụng theo cách mà nó bị thay đổi, thường thì tôi chỉ thấy nó được sử dụng cho các "hằng số" có thể in được.
Ben Lesh

2
Tuy nhiên, hằng số KHÔNG phải là bất biến. Bạn chỉ không thể ghi đè chúng bằng một lần tiêm khác vì $ cung cấp sẽ không chặn chúng để trang trí.
Ben Lesh

2
Tôi biết đây là một câu trả lời cũ, nhưng "Module.value (khóa, giá trị) được sử dụng để đưa vào một giá trị có thể chỉnh sửa, Module.constant (khóa, giá trị) được sử dụng để đưa vào một giá trị không đổi" không kiểm đếm với ng trong nó hóa thân mới nhất (1.3.4). Sự khác biệt giữa module.value () và module.constant () là: hằng số () có sẵn sớm hơn trong vòng đời ứng dụng của bạn (trong khi cấu hình và chạy); value () chỉ có sẵn trong khi chạy. Liệu chúng có thể thay đổi được hay không và các giá trị đã thay đổi có thể nhìn thấy ở đâu, phụ thuộc vào cấu trúc giá trị của chúng (nguyên thủy hay không). docs.angularjs.org/guide/providers#constant-recipe
lukkea

4

Gần đây tôi muốn sử dụng tính năng này với Karma trong một bài kiểm tra. Như Dan Doyon đã chỉ ra điểm mấu chốt là bạn sẽ chèn một giá trị giống như bộ điều khiển, dịch vụ, v.v. Bạn có thể đặt .value thành nhiều kiểu khác nhau - chuỗi, mảng đối tượng, v.v. Ví dụ:

myvalues.js một tệp chứa giá trị - hãy đảm bảo rằng nó được bao gồm trong tệp báo cáo nghiệp vụ của bạn

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 - có thể đây là tệp thông số kỹ thuật của Jasmine được tải bởi 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

Bạn cần tham chiếu csrftrong bộ điều khiển của mìnhIndexUsersCtrl = ( $scope, csrf )

IndexUsersCtrl.$inject = [ '$scope', 'csrf' ]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.