2015-10-14 19 views
10

Tôi đã tạo một chỉ thị tùy chỉnh có hai giá trị. đầu tiên là đối tượng config và thứ hai là đối tượng dữ liệu. Tôi sửa đổi cấu hình này và các đối tượng dữ liệu bên trong chỉ thị của tôi, nó phản ánh nó trong phạm vi cha mẹ. Điều này gây ra lỗi cho tôi khi tôi phải sử dụng chỉ thị nhiều lần.Angularjs chỉ thị phạm vi cô lập + một chiều ràng buộc dữ liệu không hoạt động cho các đối tượng?

Tôi đã theo dõi https://umur.io/angularjs-directives-using-isolated-scope-with-attributes/ và tôi đang sử dụng phạm vi phân lập.

Tôi muốn gắn kết một cách dữ liệu cho các đối tượng trong phạm vi phân lập. Bất cứ điều gì tôi thay đổi trong chức năng chỉ thị nó không nên phản ánh trong phạm vi phụ huynh.

bên dưới là phạm vi chỉ thị.

scope: { 
    config: "&config", 
    dataObj: "&dataObj" 
} 

ở đây là làm thế nào tôi truy cập vào nó trong hàm liên kết của chỉ thị

var config = scope.config(); 
var dataObj= scope.dataObj(); 

Tôi giả định rằng vượt qua bằng cách tham chiếu đang xảy ra ở đây.

Tôi đang thêm JSbin. kiểm tra giao diện điều khiển giá trị của đối tượng đang thay đổi và phản ánh trong phạm vi cha mẹ.

https://jsbin.com/vagowe/edit?html,js,output

+0

Vì vậy, vấn đề cụ thể là gì? Vui lòng hiển thị tất cả các mã có liên quan và tạo một [plunker] (http://plnkr.co/edit/?p = catalog) demo sao chép vấn đề – charlietfl

+0

@charlietfl Tôi đã thêm bản trình diễn. hy vọng bạn hiểu vấn đề của tôi – murli2308

+0

Bạn phải sử dụng '=' liên kết hai chiều để truyền các đối tượng tới một chỉ thị. – cgTag

Trả lời

19

qua văn bản là one-way binding(@) và đi qua đối tượng là two-way binding(=)

đi qua đối tượng dưới dạng văn bản

<custom-directive config="{{config}}"></custom-directive> 

phạm vi trong chỉ thị

scope: { 
     config: "@" 
    } 

chuyển kí trở lại đối tượng trong liên kết

var config = angular.fromJson(scope.config); 
+0

tuyệt vời của nó làm việc .. vì vậy chúng tôi đang đi qua đối tượng như stringifying đối tượng ở đây và trong chuỗi phân tích chỉ thị để đối tượng phải không? – murli2308

+0

true, thay vì truy cập như chức năng (&) có thể truy cập đối tượng phạm vi cha mẹ (nó hai chiều ràng buộc). –

+2

là cách thích hợp và duy nhất để giải quyết vấn đề này? – murli2308

4

Bạn đúng, vấn đề là đối tượng JavaScript của bạn đang được chuyển bằng tham chiếu. Sử dụng liên kết một chiều sao chép tham chiếu, nhưng tham chiếu sẽ vẫn trỏ đến cùng một đối tượng.

ấn tượng của tôi từ Angular docs for directives luôn luôn là:

  • Các '@' ràng buộc dành cho chuỗi nội suy
  • Các '=' ràng buộc dành cho cấu trúc dữ liệu cần được chia sẻ giữa các phạm vi
  • Ràng buộc '&' được thiết kế để lặp lại việc thực hiện một biểu thức được gắn với phạm vi cha mẹ

Nếu bạn wan t để điều trị các đối tượng ràng buộc từ cha mẹ như không thay đổi, bạn có thể tạo một bản sao sâu các đối tượng bên trong mã liên kết của bạn sử dụng angular.copy:

var config = angular.copy(scope.config()); 
var dataObj = angular.copy(scope.dataObj()); 

Ngoài ra, bạn có thể sử dụng một chiều hai ràng buộc cho điều này và sao chép các đối tượng theo cùng một cách:

scope: { 
    config: "=", 
    dataObj: "=" 
} 

// ... 
// Inside the link function of the directive. 
// Note that scope.config and scope.dataObj are no longer functions! 

var config = angular.copy(scope.config); 
var dataObj = angular.copy(scope.dataObj); 
+0

Tôi đã giải quyết một '' scope.config = angular.copy ($ scope.config __); 'trong bộ điều khiển chỉ thị của tôi. làm cho ý nghĩa hơn tôi nghĩ và mảng sao chép vẫn ở lại. – Blauhirn

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