Truy cập $ parent's $ parent trong chế độ xem loại trực tiếp - ngữ cảnh lồng ghép


79

Cập nhật cho ngắn gọn

Làm cách nào tôi có thể tham chiếu $ cha mẹ $ cha mẹ trong Knockout foreach lồng nhau / có ràng buộc?

Thí dụ -

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents --> // <-- Doesn't work
                <!-- ko foreach: children -->
                    <td data-bind="if: favToy().name == $parent.$parent.favToy().name">
                        <span data-bind="text: favToy().name"></span>
                    </td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Nguyên

Xin lỗi vì câu hỏi khó hiểu nhưng tôi đang cố gắng đạt đến giá trị của cấp độ cha mẹ thứ hai để kiểm tra một giá trị trong ngữ cảnh hiện tại (như bên dưới) để chỉ hiển thị một khoảng cách nếu nó khớp với giá trị của $ cha mẹ $ (ugh!)

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents -->
                <!-- ko foreach: children -->
                    <td data-bind="if: favToy().name == $parent.$parent.favToy().name">
                        <span data-bind="text: favToy().name"></span>
                    </td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Nó sẽ dễ dàng hơn để làm theo cách này nhưng từ những gì tôi đã đọc, điều này là không thể hoặc tôi đang làm sai :)

    <!-- ko foreach: grandParent -->
        <tr>
            <!-- ko foreach: $parent.parents -->
                <!-- ko foreach: children ? favToy().name == $parent.$parent.favToy().name -->
                    <td  data-bind="text: favToy().name"></td>
                <!-- /ko -->
            <!-- /ko -->
        </tr>
    <!-- /ko -->

Mọi sự trợ giúp sẽ rất được trân trọng.


Tôi không hiểu câu hỏi của bạn, những gì không hoạt động? Vấn đề của bạn là gì: là cú pháp của $parent.$parenthay bạn phải sử dụng spanvì bạn không thể hợp nhất dấu foreachif?
nemesv

Câu trả lời:


136

Sử dụng $parentsmảng, ông bà sẽ là $parents[1]. Bạn cũng có thể sử dụng $rootnếu grandParentđối tượng trong ví dụ của bạn là đối tượng chính trên cùng.

Từ các tài liệu :

$ cha mẹ

Đây là một mảng đại diện cho tất cả các mô hình chế độ xem gốc:

$ parent [0] là mô hình xem từ ngữ cảnh gốc (tức là nó giống với $ parent)

$ parent [1] là mô hình xem từ ngữ cảnh ông bà

$ cha mẹ [2] là mô hình xem từ ngữ cảnh ông bà cố

… và như thế.

$ gốc

Đây là đối tượng mô hình khung nhìn chính trong ngữ cảnh gốc, tức là, ngữ cảnh mẹ trên cùng. Nó thường là đối tượng được chuyển đến ko.applyBindings. Nó tương đương với $ cha mẹ [$ cha mẹ.length - 1].


Vì một số lý do $parent.$parentkhông hiệu quả với tôi, tuy nhiên giải pháp này hoạt động tốt và nó cũng ngắn hơn!
PeterM

8

Bạn có thể sử dụng $parentContext.$parent.

$parentContextcung cấp nhiều đặc tính hữu ích như ( $data, $parent, $index, ...)


0

Tôi nghĩ sẽ dễ dàng hơn nếu sử dụng cài đặt noChildContext như thế này:

Sử dụng “as” mà không tạo ngữ cảnh con

Hành vi mặc định của tùy chọn as là thêm tên cho mục hiện tại trong khi vẫn ràng buộc nội dung với mục đó. Nhưng bạn có thể muốn giữ nguyên ngữ cảnh và chỉ đặt tên của mục hiện tại. Hành vi sau này có thể sẽ là mặc định trong phiên bản Knockout trong tương lai. Để bật nó cho một ràng buộc cụ thể, hãy đặt tùy chọn noChildContext thành true. Khi tùy chọn này được sử dụng cùng với as, tất cả quyền truy cập vào các mục mảng phải thông qua tên đã cho và $ data sẽ vẫn được đặt thành mô hình khung nhìn bên ngoài. Ví dụ:

<ul data-bind="foreach: { data: categories, as: 'category', noChildContext: true }">
    <li>
        <ul data-bind="foreach: { data: category.items, as: 'item', noChildContext: true }">
            <li>
                <span data-bind="text: category.name"></span>:
                <span data-bind="text: item"></span>
            </li>
        </ul>
    </li>
</ul>

Đọc thêm tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.