27

私は、knockout.js(ver。2.1.0)を使用していくつかのデータを取得するいくつかのフィールドを持つフォームを持っています。たとえば、入力の「値」フィールドを更新するには、次のようにします。

<input type="text"  name="contrasena" id="login-user" value="" placeholder="" data-bind="value: user">

「pass」キーワードに使用したい値を格納するJSONがあり、正しく機能します。

同じ方法を使用して「placeholder」属性を設定しようとしましたが、機能しません。

<input type="text"  name="contrasena" id="login-user" placeholder="" data-bind="placeholder: user">

「ko.bindingHandlers['value']」に基づく「ko.bindingHandlers['placeholder']」関数を追加してknockout.jsファイルを変更しようとしました(「ko.jsonExpressionRewriting.writeValueToProperty」の「value」ではなく「placeholder」を変更します)関数)が、正しく機能しません。情報を「プレースホルダー」ではなく「値」属性に配置します。

誰もがこれを解決する方法を知っていますか?

どうもありがとうございます!

4

2 に答える 2

110

次のように、既存のattrバインディングを使用する必要があります。

<input data-bind="attr: {placeholder: ph}" />

var Model = function () {
    this.ph = ko.observable("Text..."); 
}
ko.applyBindings(new Model());
于 2012-09-28T09:40:25.270 に答える
37

を使用する場合は、jsコードでカスタムバインディングdata-bind="placeholder: user"を作成できます。

あなたはを使用して正しい道を進んでいましko.bindingHandlers['placeholder']たが、knockout.jsファイルを編集する必要はありません-実際、それは悪い習慣です。

これには、非常に基本的なカスタムバインディングが必要です。

ko.bindingHandlers.placeholder = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var underlyingObservable = valueAccessor();
        ko.applyBindingsToNode(element, { attr: { placeholder: underlyingObservable } } );
    }
};

カスタムバインディングのガイドについては、こちらを参照してください

ノックアウト自体は本質的に目障りですが、これはわずかに少ないです。プレースホルダーが要素にどのように適用されるかについての知識をビューから削除します。

実際、将来、ある種のjQueryプラグインを適用して、placeholder属性をサポートしていないブラウザーでプレースホルダーを表示したい場合、これはプラグインを初期化する場所( )になります-その中に関数init:も必要になりますupdate:場合。

于 2012-10-01T13:04:49.577 に答える