2014-11-04 63 views
0

我有一個可寫的內部自定義綁定計算格式化observable。然而,當用戶刪除格式化掩碼時,讀取函數不會觸發,因爲observable刪除所有非數字,好吧,它的工作原理應該是這樣,所以我添加了notifySubcribers來每次調用read,即使可觀察值沒有變化和它的工作,但UI元素心不是令人耳目一新的新值(讀回)NotifySubscribers不刷新用戶界面(可寫計算)

按照代碼:

ko.bindingHandlers.conta = { 
    init : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var observable = valueAccessor(), formatted = ko.computed({ 
     read : function() { 
      var val = ko.unwrap(valueAccessor()); 
      if (!val) return val; 
      if (val.toString().length < 6) { 
       val = zeroPad(val, 6); 
       observable(val); 
      } 
      return val.toString().slice(0, val.toString().length - 1) + "-" + val.toString().slice(val.toString().length - 1); 
     }, 
     write : function(value) { 

      if (value) { 
       value = zeroPad(value, 6); 
      } 

      observable(value.replace(/\D/g, '')); 
      observable.notifySubscribers(); 
     } 
    }); 

     if ($(element).is('input')) { 
      ko.applyBindingsToNode(element, { 
       numbersOnly : true, 
       maxLength : 10, 
       value : formatted 
      }); 
     } else { 
      ko.applyBindingsToNode(element, { 
       numbersOnly : true, 
       text : formatted 
      }); 
     } 

     return { 
      controlsDescendantBindings : true 
     }; 
    } 
}; 

能有人給我一些方向嗎?

感謝:d

+0

你可以擴展你的代碼,並將它製作成一個小的repro?編輯器工具欄上有一個「Stack Snippet」按鈕,它甚至可以讓你在SO上運行它。 – Jeroen 2014-11-04 14:00:23

+0

嘿,我做了這個小提琴的例子:http://jsfiddle.net/Lyad24p4/如果你抹去「 - 」,淘汰賽將調用讀取方法..但返回值isnt更新元素=( – ddacrs 2014-11-04 15:29:46

回答

0

擴展formatted計算OBS與notify: always

ko.bindingHandlers.conta = { 
    init : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var observable = valueAccessor(), formatted = ko.computed({ 
      ... 
     }).extend({ notify: 'always' }); 
... 

這將迫使它總是通知,即使沒有改變。