2012-01-19 3 views
3

Что можно считать хорошим способом обработки множества пользовательских привязок с возможностью того, что привязка отсутствует? Скажите, что мое выражение html привязывается к image_url, как показано ниже.Нокаут js множество пользовательских привязок

<span title="Company Logo" data-bind="image_url: company_banner"></span> 

Однако есть все возможности, что привязка image_url недоступна. В этом случае я просто хотел бы вернуть строковое значение company_banner.

Обычно можно добавить пользовательский обработчик, как показано ниже, но если этот обработчик недоступен, мы можем вернуть некоторую общую обратную связь?

ko.bindingHandlers.buttonLabel = {//update etc} 

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

+0

Очень хороший вопрос, к сожалению, нет ответа. Но я думаю, что вы можете более подробно проанализировать объект bindHandlers библиотеки ko, чтобы увидеть, можете ли вы что-то там сделать. Но не мог не сказать очень практичный и хороший вопрос – Vin

+0

@Vin, да только что скачал отладочную версию ko сейчас. Будет ли сообщение, если я его взломаю. – Chin

+0

@Vin, просмотрел его. К счастью кто-то – Chin

ответ

6

Для этого сценария я бы рассмотрел использование поставщика привязки. Вот статья, описывающая функциональность: http://www.knockmeout.net/2011/09/ko-13-preview-part-2-custom-binding.html.

Итак, я бы создал пользовательский поставщик привязки, который является оберткой для реального поставщика привязки. После того, как привязки разбираются, мы можем их проверить, чтобы узнать, существуют ли они в ko.bindingHandlers. Если этого не сделать, мы можем добавить текстовое связывание с его значением.

Это может выглядеть следующим образом:

ko.lenientBindingProvider = function() { 
    var realBindingProvider = new ko.bindingProvider(); 

    this.nodeHasBindings = realBindingProvider.nodeHasBindings; 

    this.getBindings = function(node, bindingContext) { 
     //parse the bindings with the real binding provider 
     var result = realBindingProvider.getBindings(node, bindingContext); 

     //inspect the returned bindings 
     for (var binding in result) { 
      if (result.hasOwnProperty(binding) && binding !== "_ko_property_writers" && !ko.bindingHandlers[binding]) { 
       //add a text binding with whatever the missing binding was bound against 
       result.text = result[binding]; 
      } 
     } 

     return result; 
    }; 
}; 

ko.bindingProvider.instance = new ko.lenientBindingProvider(); 

Вот пример: http://jsfiddle.net/rniemeyer/mMQKY/

Смежные вопросы