2014-07-09 27 views
20

Có cách nào kế thừa phạm vi gốc trong khi mở rộng nó bằng thuộc tính đã chuyển không?Thuộc tính phạm vi chỉ thị mà không có phạm vi biệt lập trong AngularJS

Tôi muốn chuyển tham số cho chỉ thị có thể sử dụng lại trực tiếp từ mẫu mà không phải thay đổi DOM trong hàm liên kết.

Ví dụ:

<form-input icon="icon-email" label="email" ng-model="data.input"></form-input> 

Đối với một chỉ thị như thế này:

<div class="form-group"> 
     <label>{{label}}</label> 
     <div class="input-group"> 
     <div class="{{icon}}">@</div> 
     <input class="form-control" placeholder="Email" ng-model="mail.email"> 
     </div> 
    </div> 

ng mô hình là trong phạm vi phụ huynh, việc kiểm soát một hình thức toàn bộ trong trường hợp này, nhưng tôi không nghĩ rằng cần lưu trữ các thuộc tính tạo kiểu trong bộ điều khiển.

Có cách nào chuyển trực tiếp tham số trong mẫu mà không tạo phạm vi cách ly không?

Trả lời

26

Bạn sẽ không thể 'mở rộng' phạm vi gốc như vậy. Tuy nhiên mục tiêu của bạn có thể được thực hiện bằng cách sử dụng các thuộc tính thẻ chỉ thị được tiêm vào hàm liên kết của chỉ thị của bạn.

Vì vậy, ví dụ: để gắn biến label của bạn, chức năng liên kết của chỉ thị của bạn sẽ trông như dưới đây:

link: function ($scope, $element, $attributes) { 
     $scope.label = $scope.$eval($attributes.label); 
     } 


Bạn có thể kiểm tra plunker dưới đây cho một bản demo sống.
http://plnkr.co/edit/2qMgJSSlDyU6VwdUoYB7?p=preview

+1

Tôi đoán không có cách nào xung quanh liên kết đó. Plunk của bạn chỉ là những gì tôi cần. – BarakChamo

+1

Tôi đã xóa phần "$ scope. $ Eval" và sử dụng giá trị được cung cấp trực tiếp trong "$ attributes", vì tôi đang mong đợi chuỗi và không muốn người dùng chỉ thị phải bao bọc mọi thứ bằng dấu ngoặc kép. Đó có phải là một thực hành tồi? Cảm ơn các giải pháp bằng cách này! – eitanfar

+0

@eitanfar Để vượt qua một chữ, bạn nói đúng - bạn không cần phải gọi '$ scope. $ Eval ', vì không có gì để nội suy. http://stackoverflow.com/a/15671573/3123195 có lời giải thích cấp cao tốt cũng như liên kết tới tài liệu. –

5

answer from Angad sẽ hoạt động để liên kết tĩnh, nhưng nếu giá trị của thuộc tính có thể thay đổi sau khi liên kết, điều này sẽ không được cập nhật. Nếu bạn cần điều này, các sollution sẽ vượt qua giá trị như chuỗi thay vì tham khảo:

<form-input icon="icon-email" label="{{email}}" ng-model="data.input"></form-input> 

Trong chỉ thị, thêm một $ quan sát trên thuộc tính để cập nhật các biến phạm vi:

$attributes.$observe('label', function(newValue){$scope.label=newValue}); 

Bây giờ biến phạm vi sẽ tự động thay đổi nếu giá trị thuộc tính thay đổi.

+0

bạn có thể thực hiện theo cách dữ liệu hai chiều theo cách này không? mà không có phạm vi bị cô lập? – beNerd

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