2011-11-09 15 views
5

Trong knockoutjs 1.2.1 tôi có thể làm:tùy chọn Đi qua các mẫu trong loại trực tiếp 1.3

<div data-bind="template: {name: 'Bar', foreach: persons, templateOptions:{fooMode: true} }"/> 

<script id='Bar'> 
    {{if $item.fooMode}} FOO! {{/if}} 
</script> 

Mà tôi đã cố gắng dịch để knockout 1.3.0beta như

<div data-bind="template: {name: 'Bar', foreach: persons, templateOptions:{fooMode: true} }"/> 

<script id='Bar'> 
    <span data-bind="if: $item.fooMode">FOO!</span> 
</script> 

Nhưng mẫu bản địa mới động cơ không tôn trọng templateOptions.

Có cách nào khác để tôi có thể chuyển dữ liệu tùy ý vào mẫu không?

Trả lời

8

Khi bạn phát hiện ra, công cụ mẫu gốc không hỗ trợ templateOptions vốn là trình bao bọc cho chức năng options của plugin Mẫu jQuery.

Hai cách bạn có thể truy cập: Đặt dữ liệu của bạn trên kiểu xem và sử dụng $root.fooMode hoặc $parent.fooMode bên trong mẫu của bạn. Đây sẽ là lựa chọn dễ nhất.

Ngược lại, nếu bạn không muốn giá trị trong mô hình quan điểm của bạn, sau đó bạn có thể sử dụng một tùy chỉnh ràng buộc để thao tác các bối cảnh như:

ko.bindingHandlers.templateWithOptions = { 
    init: ko.bindingHandlers.template.init, 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, context) { 
     var options = ko.utils.unwrapObservable(valueAccessor()); 
     //if options were passed attach them to $data 
     if (options.templateOptions) { 
      context.$data.$item = ko.utils.unwrapObservable(options.templateOptions); 
     } 
     //call actual template binding 
     ko.bindingHandlers.template.update(element, valueAccessor, allBindingsAccessor, viewModel, context); 
     //clean up 
     delete context.$data.$item; 
    } 
} 

Đây là một mẫu sử dụng: http://jsfiddle.net/rniemeyer/tFJuH/

Lưu ý rằng trong trường hợp foreach, bạn sẽ tìm thấy các tùy chọn của mình trên $parent.$item thay vì chỉ $item.

+0

Cảm ơn rất nhiều. Tôi có cảm giác rằng những người đóng góp có thể đưa tôi đến nơi tôi muốn, nhưng tôi đã mất nhiều thời gian để tìm ra nó. – Greg

+0

Cảm ơn, điều này đã giúp tôi rất nhiều. Mặc dù ban đầu nó không hoạt động, tôi đã nhận được nó bằng cách thay đổi ngữ cảnh. $ Data. $ Item thành context. $ TemplateOptions thay thế. – Stuntbeaver

+0

Lưu ý rằng các tùy chọn ($ item) không được chuyển sau khi bạn áp dụng các ràng buộc lần đầu tiên - vì chúng bị xóa - điều này làm cho việc thêm và sửa đổi các thành phần không sử dụng được –

7

Tôi sẽ đề xuất đề xuất của Sanderson nơi bạn sẽ chuyển dữ liệu mẫu mới vào mẫu có chứa mô hình và dữ liệu bổ sung (tùy chọn mẫu).

data-bind="template: { name: 'myTemplate', data: { model: $data, someOption: someValue } }" 

Working Demo http://jsfiddle.net/b9WWF/

Nguồn https://github.com/knockout/knockout/issues/246#issuecomment-3775317

+0

Vukoje. Cách tiếp cận thích ứng rất tốt, không liên kết - Thx! – Cody

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