2013-01-16 89 views
0

我有一個第三方自定義jquery組件覆蓋了一個複選框,並提供了一個漂亮的「切換」外觀。該組件具有每當用戶單擊該組件時都會發生的函數回調。KnockoutJS - 如何更新一般的觀察值

如何使用事件目標設置可觀察值,而無需特別瞭解視圖模型中哪些屬性正在調用事件。

例如:

HTML是:

<input type="checkbox" id="cb123" data-bind="checked: IsDeleted" /> 
<input type="checkbox" id="cb345" data-bind="checked: IsValid" /> 

JavaScript回調是這樣的:

$(document).ready(function() { 
    .... Code snipped .... 
    var viewModel = ko.mapping.fromJS(myModel); 
    ko.applyBindings(viewModel); 

     $(':checkbox').toggleCheckbox({ 
      onChange: function($el, value, e) { 
       var ctx = ko.contextFor(e.target); // Gets me the knockout context object. 

       // How do I set the appropriate observable value from here? 
       // In this case either one of the checkboxes could have been triggered. 
      } 
     }); 
}); 

任何幫助,將不勝感激。獲得可觀察到的

+0

嘿,歡迎來到SO。我剛剛開始與knockout自己合作,所以我不太確定,但是您可以使用計算的observable(如果需要從複選框中拉取值並運行任何檢查),然後讓它訂閱複選框(S)。只是一個想法。 – War10ck

回答

1

一種方法是分析數據綁定屬性本身:

// inside your event handler 
var viewModel = ko.dataFor(e.target); 
var bindValue = $(e.target).data('bind'); 
// in case you applied 'checked' binding only: data-bind="checked: IsDeleted" 
var observableName = $.trim(bindValue.split(':')[1]); 

// get value 
var _value = viewModel[observableName](); 
// set value: viewModel[observableName](newValue); 
0

考慮使用自定義bindingHandler初始化toggleCheckbox。

<input type="checkbox" id="cb123" data-bind="toggleCheckboxChecked: IsDeleted" /> 
<input type="checkbox" id="cb345" data-bind="toggleCheckboxChecked: IsValid" /> 

的Javascript:

ko.bindingHandlers.toggleCheckboxChecked = { 
    init: function (element, valueAccessor) { 
     // This is just to set the initial value of the checkbox 
     element.checked = ko.utils.unwrapObservable(valueAccessor()); 

     // Then turn the element into an enhanced checkbox 
     $(element).toggleCheckbox({ 
      onChange: function($el, value, e) { 
       var checkedBinding = valueAccessor(); 
       checkedBinding(value); 
      } 
     }); 
    }, 
    update: function (element, valueAccessor) { 
     // this is invoked by knockout when checkedBinding changes, so 
     // to get a two-way-binding you need to update the checkbox component 
     // here with ko.utils.unwrapObservable(valueAccessor()) 
    } 
} 

有關於在official page自定義綁定處理程序的一些信息,但我也建議rniemeyer的博客,特別是this post

相關問題