Knockoutの "attr"データバインディングを"readonly"や"disabled"などのスタンドアロン属性とともに使用するための「ベストプラクティス」の推奨される方法は何ですか?
これらの属性はspecialであり、通常は属性値を属性名に設定することで有効になります(ただし、属性名を含めるだけで多くのブラウザが正常に動作します) HTMLに値がない場合):
<input type="text" readonly="readonly" disabled="disabled" value="foo" />
ただし、do n'tにこれらの属性を適用したい場合、一般的には(readonly = "false"のようなものを実行するのではなく)HTMLから属性を完全に省略します。
<input type="text" value="foo" />
Knockoutの「attr」データバインディングはこのシナリオをサポートしていません。属性名を指定したらすぐに、値も指定する必要があります。
<input type="text" data-bind="attr: { 'disabled': getDisabledState() }" />
「無効」または「読み取り専用」をオフにするクロスブラウザーの方法はありますか?または、アイテムを無効にしたくない、または読み取り専用にしたくない場合、カスタムバインディングをレンダリングしないように使用できるトリックanythingがありますか?
Knockoutの「attr」データバインディングはこのシナリオをサポートしていますが、getDisabledState()
関数からnull
またはundefined
を返すだけで、属性を出力しません。
デモ フィドル 。
次のように読み取り専用のバインディングを作成することもできます。
ko.bindingHandlers['readonly'] = {
'update': function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (!value && element.readOnly)
element.readOnly = false;
else if (value && !element.readOnly)
element.readOnly = true;
}
};