3

ノックアウトマッピング プラグインを使用してビューを自動作成していますが、正常に動作しています。

ただし、マップされたオブジェクトの値に基づいてゲージを生成するためにRaphael.jsを使用していますが、更新されたすべてのオブザーバブルに対してゲージが再描画されることに気付きました。ページ上にこれらのゲージが多数あることを考えると、AJAX 呼び出しから新しいデータを取得するたびにそれらを 3 回再描画することは、パフォーマンスにとってあまり良くありません。

copyそのため、マッピング オプションを使用して、オブジェクトのプロパティの 1 つを除くすべてを通常の JavaScript プロパティに変更しました。

今私が抱えている問題は、すべてのストレートな JavaScript プロパティが更新される前に、1 つの監視可能なプロパティが更新されているため、ゲージの一部が同期していないことです。具体的には、観測可能なプロパティは DisplayValue で、ゲージの中央にテキストとして出力しますが、実際にゲージに線を描画するために使用する通常のプロパティ PercentValue もあります。そのため、DisplayValue は PercentValue の前に更新されます。これにより、ゲージが再描画されます。つまり、ゲージの線には、現在の PercentValue ではなく、常に最後の PercentValue が表示されます。

スロットルエクステンダーを見てきましたが、これを機能させるには、両方のオブザーバブルを含む計算されたプロパティを追加する必要があるようですが、プロパティを追加する必要があるという考えは好きではありませんこの機能を取得します。同様に、監視可能なプロパティ (LastUpdated など) を追加して、オブジェクト全体が更新された後に手動で更新できると思いますが、それも満足のいくものではありません。

combinedObservableに対して提起された問題があるように見えるので、現時点では私が望む方法でこれを行う方法はないと思います。

それで、これを完全に行うより良い方法はありますか?オブザーバブルの前に通常の JavaScript プロパティを更新する方法はありますか? プロパティはアルファベット順に処理されていると思いますか?

4

1 に答える 1

2

私はほとんどRPの提案を実装しましたが、彼がコメントとしてそれを述べたように、私はそれを少し違った方法で実装しました.

DisplayValue をオブザーバブルとして残すのではなく、ゲージが通常の JS プロパティを使用するすべてのプロパティを作成しましたが、updated と呼ばれる新しいオブザーバブル プロパティをオブジェクトに追加しました。マッピング プラグインを使用して新しいデータを既存のオブジェクトにコピーしたら、上記の valueHasMutated メソッド RP を使用します。

ko.mapping.fromJS(point, existingPoint);
existingPoint.updated.valueHasMutated();

使用して観察可能なプロパティに結び付けるノックアウトカスタム バインディング ハンドラーがあります。

ko.utils.unwrapObservable(viewModel.updated);

そして今、更新イベントが1つしか発生しません。明らかに、これが理想的であるとはまだ思いませんが、マッピング プラグインが、すべての通常のプロパティをコピーした後にオブザーバブルが更新されたことのみを起動するオプションを取得しない限り、これはおそらく最良のオプションです。

于 2013-01-03T11:08:50.710 に答える