1

テーブルにデータを表示していますが、一部のフィールドが長すぎて行が高すぎるため、オーバーフローを遮断し、問題のあるフィールドを省略記号で表示するカスタム バインディングを作成しています。

a, b, c, d,...

次に、ユーザーがフィールドをクリックすると、そのフィールドのすべてのデータを示すデータが「再表示」されます。

ただし、バインディングが正しく機能していません。私の目標は、最初にすべてのオーバーフローを非表示にし、ユーザーがフィールドをクリックすると各フィールドを再表示することです。

私のバインディングは逆のことをしています。最初に、フィールドを再表示してレンダリングしユーザーがクリックするとフィールドを非表示にします。ただし、最初のクリックが発生すると、フィールドは再び切り替わりません。

私のフィドル

ちょっと考え過ぎのような気もしますが…

アップデート

クリック イベントが発生すると、options.data の値は常に最初に変更された値のままになります。現在のバージョンの hideOverflow を valueAccessor として click init 関数に送信するにはどうすればよいですか?

4

3 に答える 3

1

RP Niemeyer のソリューションと、特定のケースに対する私のソリューションでフィドルを更新しました。

http://jsfiddle.net/dzul1983/fT4dH/5/

15行目に強打を追加しました

options.data = !ko.utils.unwrapObservable(options.data);

update バインディングは、init でもトリガーされるという点で少し誤解を招くと思います。

于 2013-03-06T20:23:12.663 に答える
1

hideOverflowクリックバインディングに渡された値(データ自体、真実です)に設定するのではなく、オブザーバブルを切り替えたいと思うでしょう。

したがって、次のことができます。

self.changeOverflow = function () {
    self.hideOverflow(!self.hideOverflow());
};
于 2013-03-06T19:38:13.303 に答える
0

この問題は、を呼び出す無名関数を返すのではなく、newValueAccessorへの呼び出しを返すために発生しました。私はこれを変更しました...options.clickoptions.click

var newValueAccessor = function () {
    return options.click(!ko.utils.unwrapObservable(options.data));
};

これに...

var newValueAccessor = function () {
    return function (data) {
        options.click.call(viewModel, !data.hideOverflow());
    };
};

そしてそれは魅力のように機能します

于 2013-03-07T14:23:08.570 に答える