2012-06-29 24 views
5

Tôi đã tạo một plugin knockoutjs sử dụng ko.renderTemplate trong phần "cập nhật" của trình xử lý ràng buộc của nó. Mã này tạo ra kết quả mong đợi nhưng cũng ném một lỗi "Không thể phân tích cú pháp".knockoutjs "Không thể phân tích cú pháp" trong plugin bằng cách sử dụng ko.renderTemplate

Tái tạo sự cố này có thể tìm thấy tại đây http://jsfiddle.net/rhoadsce/VSWK2/ trên jsfiddle.

Các javascript như sau:

ko.plugin = function(configuration) { 
    var self = this; 
    self.content = configuration.content || ''; 
}; 

ko.bindingHandlers.plugin = { 
    update: function(element, valueAccessor, allBindingsAccessor) { 
     var viewModel = valueAccessor(); 

     $(element).append('<div id="pluginContainer"></div>'); 
     var $container = $(element).children('#pluginContainer'); 

     ko.renderTemplate("pluginTemplate", viewModel, {}, $container, 'replaceNode'); 
    } 
}; 

$(function() { 
    var vm = (function() { 
     var plugin = new ko.plugin({ content: 'test content'}); 

     return { 
      plugin: plugin 
     } 
    })(); 

    ko.applyBindings(vm); 
}); 

Các html cũng không kém phần đơn giản.

<div data-bind="plugin: plugin"></div> 

<script id="pluginTemplate" type="text/html"><span data-bind="text: content"></span></script> 
+3

+1: code, fiddle, nỗ lực rõ ràng để thành công một mình và một vấn đề thú vị. Câu hỏi đầu tiên tuyệt vời, chào mừng bạn đến Stack Overflow – Tyrsius

Trả lời

4

Tôi nghĩ vấn đề là KO đang cố gắng áp dụng các ràng buộc cho hậu duệ của div (và nó thực hiện điều này với viewmodel gốc như bối cảnh, thay vì các plugin bên trong máy ảo), nhưng các cuộc gọi đến ko.renderTemplate bản thân đã áp dụng các ràng buộc cho hậu duệ (với ngữ cảnh chính xác).

Để ngăn chặn điều này, hãy thực hiện phương pháp init của trình xử lý bắt buộc của bạn trở về { controlsDescendantBindings: true }. Điều này ngăn cản KO cố gắng áp dụng các ràng buộc. Here's the updated fiddle.

Xem tại đây để biết thêm thông tin: http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

+0

Cảm ơn! Điều đó đã làm các trick. – rhoadsce

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