2017-02-08 7 views
0

У меня есть пользовательский интерфейс с сотнями шаблонов для нокаута. Настало время разработать еще один интерфейс. Мне нужно префикс старых ссылок на URL-адрес файла шаблона с помощью «uiv1». Forexample, где бы я ни сказалКак установить префикс URL привязки шаблона в нокаут?

data-bind="name: 'admin/dashboard'" 

Я ожидал бы, чтобы решить, чтобы

data-base="name: 'uiv1/admin/dashboard' 

Есть ли простой способ настройки, что в нокауте? Например, некоторая конфигурация, которую я могу передать в ko.applyBindings()? Я ничего там не видел в источнике, но, возможно, это еще не так.

+0

для моей информации, как шаблон имени разрешаются в файл URL? Это не стандартный материал KO, не так ли? – miellaby

+0

Я думаю, что это происходит от принятия базового url («http (s)» плюс «www.domainName.com» плюс «/»), за которым следует относительный URL-адрес, который вы указываете при нокауте. – Calicoder

ответ

1

было бы лучше переименовать все экземпляры, если это возможно.

В противном случае, это хакерский способ сделать это.

var old_template = ko.bindingHandlers['template']; 
 
var prefix = 'uiv1/' 
 

 
// modifying template binding 
 
ko.bindingHandlers['template'] = { 
 
    'init': function(element, valueAccessor) { 
 
    var bindingValue = ko.utils.unwrapObservable(valueAccessor()); 
 
    if (typeof bindingValue === 'string') bindingValue = prefix + bindingValue; 
 
    else if (bindingValue.name) bindingValue.name = prefix + bindingValue.name; 
 
    return old_template.init(element, function() { 
 
     return bindingValue 
 
    }); 
 
    }, 
 
    'update': function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
 
    return old_template.update(element, valueAccessor, allBindings, viewModel, bindingContext); 
 
    } 
 
} 
 

 
// view model 
 
var vm = { 
 
    buyer: { name: 'Franklin', credits: 250 }, 
 
    seller: { name: 'Mario', credits: 5800 }, 
 
    original: { name: 'original', credits: 20000 } 
 
}; 
 

 
ko.applyBindings(vm, document.getElementById('modified')); 
 

 
//resetting it to original 
 
ko.bindingHandlers['template'] = old_template; 
 

 
ko.applyBindings(vm, document.getElementById('original'));
body { font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js"></script> 
 
<script type="text/html" id="uiv1/admin/dashboard"> 
 
    <h3 data-bind="text: name"></h3><span>(from: "uiv1/admin/dashboard")</span> 
 
    <p>Credits: <span data-bind="text: credits"></span> 
 
    </p> 
 
</script> 
 
<script type="text/html" id="dashboard"> 
 
    <h3 data-bind="text: name"></h3><span>(from: "dashboard")</span> 
 
    <p>Credits: <span data-bind="text: credits"></span> 
 
    </p> 
 
</script> 
 

 
<div id="modified"> 
 
    Modified Template 
 
    <div data-bind="template: { name: 'admin/dashboard', data: buyer }"></div> 
 
    <div data-bind="template: { name: 'admin/dashboard', data: seller }"></div> 
 
</div> 
 
<hr> 
 
<div id="original"> 
 
    Original Template 
 
    <div data-bind="template: { name: 'dashboard', data: original }"></div> 
 
</div>

+0

Это временное решение для рефакторинга. Благодарю. – Calicoder