2012-12-15 25 views
12

Hàm dưới đây xác định một biến trong rootscope.không thể truy cập rootscope var trong phạm vi chỉ thị

function MyCtrl($scope, $rootScope) { 
    $rootScope.buttons = [{href: '#/students', icon:'icon-ok'}, 
         {href: '#/students', icon:'icon-remove'}, 
         {href: '#/students/new', icon:'icon-plus'}]; 
} 
MyCtrl.$inject = ['$scope', '$rootScope']; 

Các html trong chỉ thị dưới đây phụ thuộc vào một biến trong rootscope -

angular.module('btnbar.directive', []). 
directive("btnBar", function(){ 
    return { 
    restrict: 'E', 
    scope :{}, 
    controller: function($scope, $element,$rootScope) { 
    }, 
    template:'<div class="btn-toolbar">' + 
     '<a class="btn" ng-repeat="b in buttons" href={{b.href}}>' + 
     '<i class={{b.icon}}></i></a></div>', 
    replace:true 
    } 
}); 

Tuy nhiên, công việc mã doesnt trên. Nó hoạt động nếu tôi trực tiếp xác định các 'nút' var trong phạm vi chỉ thị.

Trả lời

21

Bạn có một cô lập phạm vi trong chỉ thị của bạn

scope:{} 

này có nghĩa là chỉ thị không được tiếp cận với phạm vi trên - hãy nhớ rằng cô lập phạm vi không nguyên mẫu kế thừa từ phạm vi phụ huynh. Vì vậy, bạn hoặc loại bỏ các phạm vi cô lập hoặc nói với các chỉ thị để ràng buộc một số thuộc tính phạm vi địa phương của nó từ phạm vi phụ huynh.

scope: {buttons: '='} 

Sau đó gọi chỉ thị như

<btn-bar buttons="buttons"></btn-bar> 

Ví dụ này: http://plnkr.co/edit/88R66L7uAHoezDZvuoH5?p=preview


Ngoài ra, chứ không phải là sửa đổi $rootScope từ một bộ điều khiển, bạn có thể muốn làm điều đó từ run phương pháp

var app = angular.module('app', ['btnbar.directive']); 

app.run(function($rootScope){ 
    $rootScope.buttons = [{href: '#/students', icon:'icon-ok'}, 
         {href: '#/students', icon:'icon-remove'}, 
         {href: '#/students/new', icon:'icon-plus'}]; 
}); 
+1

Jim nhờ trả lời tuyệt vời. Một câu hỏi tại sao tôi cần phải xác định các nút = "nút" trong thuộc tính của tôi. Ngoài ra nó làm gì? Tại sao wont mã hoạt động mà không có khai báo thuộc tính trên? – murtaza52

+0

vì bộ điều khiển chỉ thị chấp nhận phạm vi, phần tử, thuộc tính và transclude, tham số thứ ba ur là $ rootScope mà thực sự là tham số thuộc tính. đây là mã điều khiển ur: chức năng ($ scope, $ element, $ rootScope). Bây giờ, hãy xem tài liệu http://docs.angularjs.org/guide/directive – AsadYarKhan

+0

@AsadYarKhan Tôi nghĩ bạn đang nhầm lẫn bộ điều khiển với liên kết và biên dịch. – Usagi

19

Hãy thử:

<a class="btn" ng-repeat="b in $root.buttons" href={{b.href}}>

+0

Câu trả lời này có ý nghĩa hơn khi xem xét tiêu đề của câu hỏi –

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