2012-06-29 3 views
5

Я создал плагин knockoutjs, который в конечном итоге использует ko.renderTemplate в части «обновления» его обработчика привязки. Код генерирует ожидаемый результат, но также генерирует ошибку «Невозможно разобрать привязки».knockoutjs «Невозможно разобрать привязки» в плагине с использованием ko.renderTemplate

Воспроизведение этой проблемы можно найти здесь http://jsfiddle.net/rhoadsce/VSWK2/ на jsfiddle.

Код JavaScript заключается в следующем:

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); 
}); 

HTML, является столь же просто.

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

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

+1: код, скрипку, очевидные попытки добиться успеха в одиночку, и интересный вопрос. Отличный первый вопрос, добро пожаловать в Stack Overflow – Tyrsius

ответ

4

Я думаю, что проблема в том, что KO пытается применить привязки для потомков Дивов (и делает это с корнем ViewModel в качестве контекста, вместо внутреннего плагин VM), но вызов ko.renderTemplate себя уже применяет привязки к потомкам (с правильным контекстом).

Чтобы предотвратить это, сделайте свой метод initHandler методом init { controlsDescendantBindings: true }. Это не позволяет KO пытаться применить привязки. Here's the updated fiddle.

Смотрите здесь для получения дополнительной информации: http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

+0

Спасибо! Это сделал трюк. – rhoadsce