2012-03-09 22 views
16

Tốt nhất là nên giải thích bằng một ví dụ. This là ví dụ được liên kết từ blog Knockout về cách sử dụng $parent. Tuy nhiên, trong trường hợp này, $parent có vẻ giống như $root, vì vậy tôi gặp khó khăn khi thấy lợi ích.Tôi có thể nhận được mảng quan sát mà tôi đang truy cập vào bên trong không?

Trường hợp nói $parent.lastUpdated, tôi muốn truy cập vào mảng quan sát được, this.products. Tôi nhận ra tôi có thể nói $root.products. Tuy nhiên, tôi muốn khái quát hóa điều này, thay vì viết nó một cách rõ ràng cho mọi danh sách.

Tôi thực sự sẽ sử dụng kết hợp này với ko.contextFor.

Trả lời

27

Bạn không thể truy cập (chung) tới ObservableArray đang được lặp qua trực tiếp bên trong vòng lặp foreach.

$root$parent là về phạm vi, do đó, nó sẽ chỉ cung cấp cho bạn đối tượng chứa ObservableArray.

Tuy nhiên, bạn có thể tận dụng điều này bằng cách đảm bảo rằng phạm vi là ObservableArray của bạn bằng cách sử dụng liên kết with.

Nếu bạn chỉ cần các mảng cơ bản, sau đó bạn có thể làm:

<div data-bind="with: products"> 
    <ul data-bind="foreach: $data"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.length"></em> 
     </li> 
    </ul> 
</div>​ 

Nếu bạn thực sự cần observableArray, sau đó bạn cần phải chắc chắn rằng nó chưa được tháo (trong ví dụ trên $data là chưa được tháo). Để làm điều này, bạn có thể chuẩn hóa tên của mảng và tìm kiếm nó trong mẫu của bạn như:

<div data-bind="with: { theArray: products }"> 
    <ul data-bind="foreach: theArray"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.theArray().length"></em> 
     </li> 
    </ul> 
</div>​ 

Đây là một mẫu: http://jsfiddle.net/rniemeyer/T6JvV/

Nếu bạn không thể sống chung với thêm các div, sau đó bạn chắc chắn có thể sử dụng các ràng buộc dòng chảy kiểm soát không chứa container như:

<!-- ko with: { theArray: products } --> 
    <ul data-bind="foreach: theArray"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.theArray().length"></em> 
     </li> 
    </ul> 
<!-- /ko --> 
+0

Cảm ơn, cả thông tin không thể thực hiện được và cho công việc 'có'. –

+0

Có một vấn đề "nhỏ" với điều này (giải pháp 1 sử dụng "với" trên mảng quan sát được) .. "với" gây ra vẽ lại cấu trúc con (tôi đã ghi đè lên logic của "với" để tránh điều này nhưng ra khỏi hộp Tôi tin rằng đây là cách nó hoạt động khi đột biến của các quan sát - cùng với nếu) dẫn đến bất kỳ yếu tố không bị ràng buộc để được thiết lập lại - bạn có thể cần tấm bootstrap ví dụ mà không bị ràng buộc. Tôi đang trên nhiệm vụ tìm ra điều này - có thể thiết lập một biến mẹ bối cảnh $ mà được nhân bản khi bối cảnh con được tạo ra vì vậy bối cảnh $ ['myContextualArrayId'] là có .. –

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