2013-09-22 29 views
61

Tôi có chỉ thị sau:AngularJs Truyền dữ liệu phức tạp để chỉ thị

<div teamspeak details="{{data.details}}"></div> 

này là cấu trúc đối tượng:

data: { 
       details: { 
        serverName: { type: 'text', value: 'my server name' }, 
        port: { type: 'number', value: 'my port' }, 
        nickname: { type: 'text' }, 
        password: { type: 'password' }, 
        channel: { type: 'text' }, 
        channelPassword: { type: 'password' }, 
        autoBookmarkAdd: { type: 'checkbox' } 
       } 
} 

và tôi muốn nó để tạo ra một liên kết dựa trên các dữ liệu bên trong data.details vật. Đáng tiếc là nó không hoạt động kể từ bằng cách nào đó tôi cann't truy cập vào bất kỳ giá trị bên trong của đối tượng details, nhưng nếu tôi đi qua nó một cấu trúc dữ liệu đơn giản như:

<div teamspeak details="{{data.details.serverName.value}}"></div> 

tôi có thể truy cập nó bằng cách sử dụng {{details}} .

Đây là Mã Chỉ thị của tôi:

App.directive('teamspeak', function() { 
    return { 
     restrict: 'A', 
     template: "<a href='ts3server://{{details.serverName.value}}:{{details.port.value}}'>Teamspeak Server</a>", 
     scope: { 
      details: '@details', 
     }, 
     link: function (scope, element, attrs) { 
     } 
    }; 
}); 

Cảm ơn

Trả lời

90

đọc trên Angularjs official site giải thích:

@ hoặc @attr - ràng buộc một tài sản phạm vi địa phương với giá trị của DOM thuộc tính. Kết quả luôn là một chuỗi vì thuộc tính DOM là chuỗi. Nếu không có tên attr nào được chỉ định thì tên thuộc tính là được giả định giống với tên địa phương. Định nghĩa về phạm vi và tiện ích con: {localName: '@ myAttr'}, thì thuộc tính phạm vi tiện ích localName sẽ phản ánh giá trị nội suy của hello {{name}}. Vì thuộc tính name thay đổi nên thuộc tính local name trên phạm vi tiện ích sẽ là thuộc tính localName. Tên được đọc từ phạm vi phụ huynh (không phải phạm vi thành phần).

Vì vậy, bạn chỉ có thể gửi một chuỗi, để chuyển một đối tượng, bạn cần phải thiết lập ràng buộc hai hướng bằng cách sử dụng =.

scope: { 
     details: '=', 
    }, 

Và HTML chí của bạn trông như

<div teamspeak details="data.details"></div> 
+27

Làm thế nào nó có thể được thực hiện mà không cần cô lập phạm vi ??? – Luckylooke

+1

Điều này dường như không hoạt động với TypeScript.Những gì tôi đã làm là tạo ra một giao diện xác định phạm vi. Trong giao diện đó, tôi có một đối tượng tùy chỉnh. Khi gán giao diện cho phạm vi, tôi không thể làm 'object = '='', bởi vì bạn không thể gán một chuỗi cho một đối tượng kiểu 'ObjectType'. Bất kỳ đề xuất về cách làm điều này với TypeScript? –

34

Có người hỏi về cách để làm điều đó mà không cần cách ly phạm vi, đây là một giải pháp:

<div teamspeak details="{{data.details}}"></div>

App.directive('teamspeak', function() { 
    return { 
     restrict: 'A', 
     template: "<a href='ts3server://{{details.serverName.value}}:{{details.port.value}}'>Teamspeak Server</a>", 
     link: function (scope, element, attrs) { 
      if(attrs.details){ 
       scope.details = scope.$eval(attrs.details); 
      } 
     } 
    }; 
}); 

Chúng ta có thể thậm chí sử dụng $interpolate nếu có bất kỳ giá trị nào trong attrs.details sh Ould được tự động thiết lập với góc {{...}} biểu ...

scope.details = scope.$eval($interpolate(attrs.details)(scope));

(đừng quên tiêm $interpolate dịch vụ vào thị của bạn)

Lưu ý quan trọng: Tôi có không thử nghiệm phương pháp này với góc 2.

+1

Nếu bạn sử dụng attrs, bạn sẽ gặp khó khăn khi chuyển đổi chỉ thị này sang góc cạnh 2. Đây chỉ là một gợi ý cá nhân. – sh977218

+0

thanks @ sh977218, tôi đã thêm lưu ý rằng phương pháp này không được thử nghiệm với góc 2 – plong0