2013-01-04 5 views
24

のようなスタンドアロンの属性を持つを結合ノックアウトの「attrの」データを使用するための提案「ベストプラクティス」の方法は、を「読み取り専用」「無効」とは何ですか?ノックアウト

これらの属性は、それらが一般的に属性名(あなたは、単にHTML内の任意の値なしで属性名が含まれている場合、多くのブラウザでは正常に動作しますが)に属性値を設定することで有効になっているという点で特別です:

<input type="text" readonly="readonly" disabled="disabled" value="foo" /> 

あなたはこれらの属性を適用する必要はありませ場合は、一般的には、単にHTML(読み取り専用=「false」のような何かをやってではなく)からそれらを完全に省略してある。

<input type="text" value="foo" /> 

ノックアウトの「attr」データバインディングは、このシナリオをサポートしていません。できるだけ早く私は、属性名を指定すると、私は同様に価値を提供する必要があります。

<input type="text" data-bind="attr: { 'disabled': getDisabledState() }" /> 

クロスブラウザの方法はあります「無効」オフにしたり、「読み取り専用」?または、カスタムバインドのレンダリングに使用できない秘訣があるアイテムを無効にしたり、読み取り専用にしたくない場合はどうすればいいですか?

+0

を私は理解していませんか? – jjperezaguinaga

+0

私が与えた例は、問題を簡単に説明するためのものです。 HTMLの属性の中にはスタンドアロンの属性があり、実際には値を必要としません。これらの属性がHTMLに影響を与えたくない場合は、それらの属性を省略するだけです。しかしKnockoutの "attr"データバインディングメカニズムは、このシナリオをサポートしていません。 –

答えて

35

ノックアウトの "attr"データバインディングは、nullまたはをgetDisabledState()ファンクションから返すだけです。この場合、この属性は発行されません。

デモFiddle

+0

Firebugまたは同様のツールを使用して属性が放出されていないことを確認するにはどうすればよいですか?上のデモFiddleから「ライブ」HTMLを表示しようとすると、ライブではなくノックアウトのデータバインディングコードが表示されます。タグ。 (しかし、私はgetDisabledState()関数で、常に "disabled"または空の文字列 ""を返していました。 –

+0

あなたのブラウザで動作していれば、動作しています。私はFirebugを使わない。 Chromeの開発ツールでは、 '' disabled ''と' 'undefined'を返すと属性が追加され削除されることは明らかです。 – nemesv

+0

OK。 Chromeを使用してこれを確認しました。迅速な対応とFiddleのデモをお寄せいただきありがとうございます。それは私には決して起こらなかったシンプルでエレガントなソリューションです。私は通常、戻り値を期待されるデータ型( 'disabled'または 'readonly'は文字列)に初期化します。私は 'undefined'に初期化していくつもりです。ありがとう! –

7

ノックアウトは、enable結合およびdisable結合を有する。

質問があったときにこれらの質問が表示されているかどうかはわかりませんが、この問題を参照している人は誰でも気をつけてください。

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; 
} 
}; 

出典::また、読み取り専用、このようなバインディングを作成することができます

+1

正しいものを選んでください。 '!observableProperty'は動作しません。 NOT '!'は評価者によって選択されません。 –

+4

!observableProperty()は機能します:) より速く、しばしばカスタムバインディングよりもきれいです。 – mikus

+1

@ P.Brian.Mackeyこれは一般的なノックアウト初心者の間違いです。あなたのような演算子を追加すると! observablePropertyの前で、propertyNameの最後に()を追加することによって明示的に呼び出す必要があります。これはノックアウトに、合成全体に式全体を持ち上げるよう指示します。 Chromeデバッガを使用して存在しない偽のobservablePropertyを入力すると、コンソールにVM:SomeLineNumberというエラーが生成されます。 VM:SomeLineNumberをクリックすると、Knockoutが生成した内容が表示されます。 –

9

あなたがさえ示すために、無効になっていない場合は無効に提供する必要がある理由https://github.com/knockout/knockout/issues/1100

+0

ソースを共有して、コードをインラインで含めてくれてありがとう。 –