2015-07-23 33 views
5

Tôi có một chỉ thị được gọi là mẫu, mã cho mẫu giống như dưới đây.Vấn đề với phạm vi accordion góc

var templates = function($compile,$parse){ 
var directive = { 
    restrict: 'EA', 
    replace: true, 
    link: link 
}; 
return directive; 

function link(scope, element, attrs) { 
scope.name = "testName"; 
    var isHtmlCompiled = false; 
} 
}; 
angular.module('templateModules', []) 
.directive('templates', templates); 

này được sử dụng chủ yếu để biên dịch mã html và hiển thị nó.Nhưng cho sự hiểu biết tốt hơn về câu hỏi tôi không sử dụng nó cho mục đích đó trong ví dụ. Tệp app.js giống như bên dưới

angular.module('ui.bootstrap.demo', ['ui.bootstrap','templateModules']); 
angular.module('ui.bootstrap.demo').controller('AccordionDemoCtrl', function ($scope) { 
    $scope.oneAtATime = true; 

    $scope.groups = [ 
    { 
     title: 'Dynamic Group Header - 1', 
     content: 'Dynamic Group Body - 1' 
    }, 
    { 
     title: 'Dynamic Group Header - 2', 
     content: 'Dynamic Group Body - 2' 
    } 
    ]; 

    $scope.items = ['Item 1', 'Item 2', 'Item 3']; 

    $scope.addItem = function() { 
    var newItemNo = $scope.items.length + 1; 
    $scope.items.push('Item ' + newItemNo); 
    }; 

$scope.add = function(){ 
    alert($scope.name); 
} 

    $scope.status = { 
    isFirstOpen: true, 
    isFirstDisabled: false 
    }; 
}); 

index.html đang sử dụng accordion như dưới đây.

<!doctype html> 
<html ng-app="ui.bootstrap.demo"> 
    <head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.13/angular.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.13.1.js"></script> 
    <script src="app.js"></script> 
     <script src="template.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> 
    </head> 
    <body> 

<div ng-controller="AccordionDemoCtrl"> 

    <accordion close-others="oneAtATime"> 
    <accordion-group heading="Static Header, initially expanded" is-open="status.isFirstOpen" is-disabled="status.isFirstDisabled"> 
     This content is straight in the template. 
    </accordion-group> 
    </accordion> 
    <accordion close-others="oneAtATime"> 
     <accordion-group heading="DYnamic" is-open="status.open" is-disabled="status.isFirstDisabled"> 
     <div templates="something"></div> 
    <button ng-click="add()">Add</button> 
    </accordion-group> 
    </accordion> 

</div> 
    </body> 
</html> 

Vấn đề tôi đang gặp phải là tôi không thể lấy giá trị phạm vi.name từ mẫu trong AccordionDemoCtrl. Có cách nào để có được giá trị đó trong AccordionDemoCtrl không?

+0

Mã của bạn dường như chưa hoàn chỉnh, chẳng hạn như định nghĩa của 'launch' và * chỉ thị khác * ... Bạn có thể thu nhỏ vấn đề xuống mã ít hơn và đặt nó trên JSFiddle , v.v. – Joy

+0

Tôi đã sửa đổi câu hỏi – robin

Trả lời

2

Bạn sẽ có thể truy cập vào name tài sản từ AccordionDemoCtrl. Vì chỉ thị của bạn có scope: false và đặt scope.name trong hàm liên kết, giống như bản trình diễn đơn giản tại đây: JSFiddle.

Đây là một bản demo làm việc sửa đổi từ ví dụ của bạn: Plunker (sử dụng hai chiều ràng buộc).


Giải thích

The directive accordion doesn't define scope, vì vậy phạm vi của nó là một từ bộ điều khiển bên ngoài. transclude:true giúp Angular tạo phạm vi con cho chỉ thị template. Nhưng kể từ khi name trên bộ điều khiển bên ngoài là một loại nguyên thủy, thiết lập các giá trị bên trong template sẽ tạo ra một name mới trên phạm vi trẻ em. Xem bản trình diễn làm việc: JSFiddle. Hình minh họa:

enter image description here

Nếu sử dụng một đối tượng thay vì một nguyên thủy, nó đang làm việc (JSFiddle).

Để biết thêm chi tiết: Understanding Scopes


Có vẻ như tốt hơn để sử dụng two-way binding để giao tiếp giữa chỉ thị và điều khiển bên ngoài.

Đây là một bản demo làm việc: Plunker

+0

Tôi đã sửa đổi app.js để bao gồm templateModule như bạn đã nói. Nhưng nó vẫn hiển thị như undefined.The vấn đề là với accordion xung quanh directive.Else nó sẽ làm việc giống như ví dụ của bạn. Mã được sửa đổi để hiển thị các thay đổi được thực hiện – robin

+0

Bằng cách này, 'phạm vi' bên trong' mẫu' chính xác là một trong 'accordion'. Kiểm tra định nghĩa 'accordion' để xem' phạm vi' của nó đến từ đâu. – Joy

+0

Nhưng tôi vẫn nhận được nó là không xác định. – robin

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