2013-07-31 25 views
5

Trong khi tôi đang cố xác định một số thuộc tính phạm vi cục bộ, tôi thấy rằng các thuộc tính được xác định bằng '@' không thể truy cập trực tiếp trong hàm liên kết trong khi đó không phải trường hợp đối tượng quy định với '=' hoặc '&'Góc: không thể truy cập thuộc tính phạm vi cục bộ được xác định bằng '@' từ chức năng liên kết

Dưới đây là các chỉ thị đơn giản tôi đã viết (jsfiddle):

angular.module('test', []) 
    .controller('testCtrl', function($scope) { 
     $scope.count1 = 5; 
    }) 
    .directive('testDir', function() { 
     return { 
      restrict: 'A', 
      scope: { 
       count: '=', 
       readonly: '@' 
      }, 
      link: function (scope, elem, attrs) { 

       console.log('Outside has count? '+('count' in scope)); 
       console.log('Outside has readonly? '+('readonly' in scope)); 

       scope.$watch('count', function(value){ 
        console.log('Inside has count? '+('count' in scope)); 
        console.log('Inside has readonly? '+('readonly' in scope)); 
        elem.text(value); 
       }); 
      } 
     }; 
}); 

Đầu ra là:

Bên ngoài có 'đếm'? true

Bên ngoài có 'chỉ đọc'? false

Bên trong có 'đếm'? true

Bên trong có 'chỉ đọc'? true

Tôi không biết tại sao scope.readonly (@) không được định nghĩa bên ngoài phạm vi. $ chức năng đồng hồ trong khi nó không phải là trường hợp cho scope.count (=)?

Trả lời

6

Đây thực sự là kết quả mong đợi, trích dẫn từ angular doc:

... trong giai đoạn nối suy chưa được đánh giá chưa và vì vậy giá trị là vào thời điểm này thiết lập để xác định.

Nếu bạn muốn nhận được giá trị của thuộc tính, bạn có thể sử dụng $observe hoặc attrs.readonly:

link: function (scope, elem, attrs) { 
    ... 

    console.log('readonly = ' + attrs.readonly); 

    attrs.$observe('readonly', function(value) { 
     console.log('readonly = ' + value); 
    }); 

    ... 
} 
Các vấn đề liên quan