https://jsfiddle.net/9L8r9etf/2/ノックアウト3+ jqueryモバイルラジオボタンをノックアウトにバインドするにはどうすればよいですか?
私はいくつかの方法を試してきましたが、これは私が得た最も近いものです。何らかの理由でthis.checkedは常に真です。
のjavascript:
ko.bindingHandlers.jqmChecked = {
init: function (element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor()); // This hack for knockout v3
// set the dom element to a checkbox and initialize it (for jquerymobile)
var checkbox = $(element);
// let jquerymobile enhance the element
checkbox.removeAttr('data-role');
// make it so
checkbox.checkboxradio();
//register change event to update the model on changes to the dom
checkbox.on('change', function (e) {
if(this.checked)
valueAccessor()(this.value);
});
},
update: function (element, valueAccessor) {
// update the checked binding, important for correct radio button behaviour.
//ko.bindingHandlers.checked.update(element, valueAccessor);
//ko.utils.unwrapObservable(valueAccessor()); // This hack for knockout v3
// and refresh the element (for jquerymobile)
var checkbox = $(element);
checkbox.checkboxradio('refresh');
checkbox.prop("checked", valueAccessor()()).checkboxradio("refresh");
}
};
var ViewModel = function(repeat) {
var self = this;
self.testa = ko.observable(true);
self.test = ko.observable("dyn");
if(repeat){
self.subView = ko.observable(new ViewModel(false));
}
};
ko.applyBindings(new ViewModel(true));
HTML:
<fieldset data-role="controlgroup" data-mini="true" data-type="horizontal">
<label><input type="radio" value="inp" name="inpdynout2" checked data-bind="jqmChecked:test"/> inp</label>
<label><input type="radio" value="dyn" name="inpdynout2" data-bind="jqmChecked:test" /> dyn</label>
<label><input type="radio" value="out" name="inpdynout2" data-bind="jqmChecked:test" /> out</label>
</fieldset>
<hr/>
x <span data-bind="text:test"></span><br/>
私はノックアウト3に、あなたはchecked.updateを使用する代わりに、独自のイベントリスナーを作成する必要があることを理解し、私がされていませんでした元のチェックされたバインドでそれを使用する方法を考え出すことができます。
カスタムバインディングが完了していないバグにすでに噛まれているため、バインディングができるだけノックアウト3バニラバインディングのように機能するようにしたいと思います。
deferUpdatesを使用してかどうかの違いは何ですか:とにかく、同期attrに確認を保つために、私はこのようなものを使用しますか?私のアプリケーションの他のものに影響することはありませんか? (まだ入手可能なバージョンではありません) $ .data(element、 "mobile-checkboxradio")は何ですか? と $(要素).attr( "checked"、 "checked"); vs $(element).prop( "checked"、element.value === unwrapped) –
質問に記載されているバグは、他人が作成したカスタムバインディングの内部的なものです。ドキュメントの中で、チェックボックスやラジオボタンのために働いていますが、テストの不足やバージョン間のセマンティクスの変更などのために、チェックボックスなどの作業が終わるだけです。 –
@RyanTheLeach:1)deferUpdates;私は失敗に対してこれをテストしました。もしあなたがそれを使わなければ、単に行を省略してください。 2)$ .data(要素、 "mobile-checkboxradio"はJQMがすでにウィジェットを作成しているかどうかをテストすることで、 "checkboxradio is not instance"エラーを回避します)3)checked:あなたのサンプルコードでこれを使用しています。あなたはフォームデータを取得し、フォームデータをサブミット/ストアするので、attrを使用するとフォームデータはko checkedValueバインディングと一致します(propまたはnothingを使用しない場合は、検査要素をチェックアウトします)。 – deblocker