2013-05-10 39 views
7

Tôi đang cố gắng hiển thị chỉ thị bên trong một chỉ thị khác (không chắc chắn nếu bộ lặp trong mẫu đang hoạt động) và dường như chỉ xuất dưới dạng văn bản thay vì biên dịch chỉ thị (mã plunker ở đây: http://plnkr.co/edit/IRsNK9)Hiển thị chỉ thị bên trong một chỉ thị khác (trong mẫu lặp)

Bất kỳ ý tưởng nào về cách tôi thực sự có thể làm cho nó hiển thị đúng chỉ dẫn của tôi-dir-one, my-dir-two, dir-ba của tôi bên trong bộ lặp?

index.html

<!doctype html> 
<html ng-app="plunker" > 
<head> 
    <meta charset="utf-8"> 
    <title>AngularJS Plunker</title> 
    <link rel="stylesheet" href="style.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.js"></script> 
    <script src="app.js"></script> 
    <script id="partials/addressform.html" type="text/ng-template"> 
     partial of type {{type}}<br> 
    </script> 
</head> 
<body> 
    <div container></div> 

    <br /><br /><br /> 
    <b>Below is just to test the directives are actually usable outside the repeater</b> 
    <div my-dir-one></div> 
    <div my-dir-two></div> 
    <div my-dir-three></div> 
</body> 
</html> 

app.js

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

app.directive('container', function() { 

    return { 
     restrict: 'A', 
     scope: {}, 
     replace: true, 

     template: '<div class="views">' + 
        ' <div class="view" ng-repeat="view in views">' + 
        '  <div {{view.dir}}>{{view.dir}}</div>' + 
        ' </div>' + 
        '</div>', 

     link: function (scope, elm) { 

      scope.views = [ 
     { dir: 'my-dir-one' }, 
     { dir: 'my-dir-two' }, 
     { dir: 'my-dir-three' } 
     ]; 
     } 
    } 
}); 

app.directive('myDirOne', function() { 
    return { 
    restrict: 'A', 
    scope: {}, 
    replace: true, 
    template: '<div>This is directive one.</div>' 
    } 
}); 

app.directive('myDirTwo', function() { 
    return { 
    restrict: 'A', 
    scope: {}, 
    replace: true, 
    template: '<div>This is directive two.</div>' 
    } 
}); 

app.directive('myDirThree', function() { 
    return { 
    restrict: 'A', 
    scope: {}, 
    replace: true, 
    template: '<div>This is directive three.</div>' 
    } 
}); 

Trả lời

8

tôi quản lý để làm việc xung quanh vấn đề này bằng cách viết lại đoạn code:

Trước tiên tôi cập nhật các mẫu mã như sau:

template: '<div class="views">' + 
      ' <div class="view-wrapper" ng-repeat="view in views">' + 
      '  <div view="{{view.dir}}"></div>' + 
      ' </div>' + 
      '</div>', 

Lưu ý rằng tôi đã tạo ra một 'xem' mới chỉ thị. Tiếp theo định nghĩa Chỉ thị xem như sau:

app.directive('view', ['$compile', function (compile) { 

    return { 
     restrict: 'A', 
     scope: { 
      view: '@' 
     }, 
     replace: true, 
     template: '<div class="view"></div>', 

     controller: ['$scope', function (scope) { 
      scope.$watch('view', function (value) { 
       scope.buildView(value); 
      }); 
     }], 

     link: function (scope, elm, attrs) { 

      scope.buildView = function (viewName) { 
       var view = compile('<div ' + viewName + '></div>')(scope); 
       elm.append(view); 
      } 
     } 
    } 
}]); 

Vì vậy, về cơ bản, biến view.dir được thông qua như là một thuộc tính để 'xem' chỉ thị, sau đó đồng hồ đó là giá trị và biên dịch một mẫu với chỉ thị trong đó .

+0

Tôi không tìm thấy bất kỳ tác dụng phụ nào của giải pháp này. Điều đó nói rằng, tôi phát hiện ra rằng nếu bạn đặt trước tất cả các mẫu (sử dụng dịch vụ $ templateCache), thì bạn có thể lấy đi mà không cần tạo một phần tử trình bao bọc. – romiem

0

Đây là một phần một vấn đề thời gian ... Tôi nghĩ rằng do thời gian nó giải quyết {{} } biểu thức, nó đã được phân tích cú pháp và đưa ra các chỉ thị. Nó không phải là làm tổ hoặc lặp lại đó là vấn đề, mỗi se.

Tuy nhiên, những gì bạn đang ở đây là 'quyết định chỉ thị nào sẽ hiển thị dựa trên giá trị của một biến'. Có một vài cách để làm điều đó.

Đây là một loại nên làm việc, mặc dù nó có thể không quy mô như độc đáo như bạn muốn:

<div class='views' ng-repeat='view in views'> 
    <div ng-switch='view.dir'> 
    <div ng-when='my-dir-one' my-dir-one /> 
    <div ng-when='my-dir-two' my-dir-two /> 
    <div ng-when='my-dire-three' my-dir-three /> 
    </div> 
</div> 

Các tùy chọn khác cho thủ đoạn tương tự: có vẻ như bạn có thể sử dụng ngBindTemplate để có một chuỗi từ dữ liệu của bạn và sử dụng nó làm mẫu cho một phần tử. Điều này có lẽ sẽ cho phép một số hành vi phức tạp (và không đọc được).

Bạn có thể chỉ định một chỉ thị cho một phần tử như một lớp, nhưng tôi không biết liệu việc sử dụng ngClass để thực hiện điều này sẽ cho phép bạn chọn động chỉ thị hoặc liệu điều đó có đến quá trễ trong đường ống hay không.

+0

Theo điểm cuối cùng của bạn, chỉ định chỉ thị cho một phần tử là một lớp không hoạt động. Các ràng buộc đến quá muộn trong đường ống, như bạn nghi ngờ. –

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