2013-04-18 2 views
0

У меня проблема, когда я хочу хранить все как строки с кавычками и отображать все без кавычек в форме. Моим первым решением было просто создать два дополнительных bindHandlers, чтобы сделать это для значения и один для текста.Запись экранированного/unescaped Наблюдаемая в нокаут

ko.bindingHandlers.escapedValue = { 
    init : function (element, valueAccessor, allBindingsAccessor) { 
     var $element = $(element), 
      contentObservable = valueAccessor(), 
      currentTxt = ko.utils.unwrapObservable(contentObservable); 

     if (currentTxt) { 
      $element.val(unescape(currentTxt)); 
     } 

     $element.change(function (e) { 
      contentObservable(escape($element.val())); 
     }); 
    } 
}; 

ko.bindingHandlers.escapedText = { 
    init : function (element, valueAccessor, allBindingsAccessor) { 
     var $element = $(element), 
      contentObservable = valueAccessor(), 
      currentTxt = ko.utils.unwrapObservable(contentObservable); 

     if (currentTxt) { 
      $element.text(unescape(currentTxt)); 
     } 

     contentObservable.subscribe(function (newValue) { 
      $element.text(unescape(newValue)); 
     }); 
    } 
}; 

Однако это дал мне два вопроса, 1) Я не получить жить обновлений больше после того, как ключ вниз 2) Когда я делаю некоторые проверки на значениях, например, длину символа он проверяет длину строки в кавычках.

Как я могу написать что-то вроде ko.escapedObservable() или ko.subscribable.fn.escaped()

я получил ближе, но не могу показаться, чтобы получить спасительную правильно. Так что теперь он показывает правильно и делает сравнение правильно, но когда я Гото сохранить его значения все еще unescped

ko.escapedObservable = function (initialValue) { 
    var observableVal = ko.observable(initialValue), 

    result = ko.computed({ 
     read: function() { 
      return unescape(observableVal()); 
     }, 
     write: function (newValue) { 
      return observableVal(escape(newValue)); 
     } 
    }); 

    this.toJSON = function() { 
     return escape(observableVal()); 
    }; 

    return result; 
}; 

==== ==== EDIT Решение с использованием двух наблюдаемых // Бегство и текст экранирования в стоимость

ko.escapedObservable = function (initialValue) { 
    var observableVal = ko.observable(initialValue), 

    result = ko.computed({ 
     read: function() { 
      return observableVal(); 
     }, 
     write: function (newValue) { 
      observableVal(newValue); 
     } 
    }); 

    result.unescaped = ko.computed({ 
     read: function() { 
      return unescape(observableVal()); 
     }, 
     write: function (newValue) { 
      observableVal(escape(newValue)); 
     } 
    }); 

    return result; 
}; 

ответ

1
ko.escapedObservable = function (initialValue) { 
    var observableVal = ko.observable(initialValue), 

    result = ko.computed({ 
     read: function() { 
      return observableVal(); 
     }, 
     write: function (newValue) { 
      observableVal(newValue); 
     } 
    }); 

    result.unescaped = ko.computed({ 
     read: function() { 
      return unescape(observableVal()); 
     }, 
     write: function (newValue) { 
      observableVal(escape(newValue)); 
     } 
    }); 

    return result; 
}; 
0

У меня возникли проблемы с выяснением того, что вы просите. Тем не менее, я полагаю, вы на самом деле просто нужно computed observable: [Example]

function viewModel() { 
    this.test = ko.observable('\"Something\"'); 

    this.escapedTest = ko.computed(function() { 
     return escape(this.test()); 
    }, this); 

    this.unescapedTest = ko.computed(function() { 
     return unescape(this.escapedTest()); 
    }, this); 
} 
+0

да что отлично подходит для 1 поля, но представьте себе, 20,30, или неизвестное количество тех типов свойств, было бы много код для этого везде. Я хочу как-то сделать это глобально через любой нокаут, наблюдаемый, что я могу назвать escapedObservable() или что-то еще. – BillPull

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