1

で を開発してSPA webapplicationDurandalJSますが、何かわかりません。

page 1私がと を持っているとしましょう2。withpage 1でエンティティを作成し、(データベースで生成された) キーを返すモーダルがあります。databaseBreezeJS

このフェッチされたキーを渡し、2 番目のページであるページ 2 に移動します。URL に入力すると、これを行う方法がわかりました。

http://localhost:60312/#/page2?orderid=2&repairorder=2

しかし、これは の方法ではありませんDurandalか? ユーザーは独自の数字を入力して、すべての結果を得ることができます!

どうすればこれを解決できますか?

4

2 に答える 2

8

非常に優れた@Joseph Gabrielの回答に何かを追加したいと思います。デュランダルでは、これを行うことができます:

router.map( url: 'page2/:orderid/:repairorder',
            name: 'Page2',
            moduleId: 'viewModels/page2');

http://localhost:60312/#/page/2/2

しかし、これを行うこともできます:

router.map( url: 'page2',
            name: 'Page2',
            moduleId: 'viewModels/page2');

http://localhost:60312/#/page2?orderid=2&repairorder=2

渡すすべてのパラメーターを指定する必要はありません。このパラメーターは、アクティブなメソッドの入力から取得できます。

var activate = function(context) {
  console.log(context.orderid);
  console.log(context.repairorder);
}

ユーザーが URL を保存して、ブラウザーでそれを処理するだけでクエリを繰り返すことができるようにする場合は、2 番目のソリューションの方が適切な場合があります。

于 2013-05-03T14:48:05.190 に答える
5

私の知る限り、デュランダル アプリでビュー モデル間でパラメーターをシームレスに渡す唯一の方法は、通常のハッシュ ベースの URL パラメーターを使用することです。
あなたの例では、orderId と repairOrder パラメーターを取るルーターを定義すると、URL は次のようになります。 http://localhost:60312/#/page/2/2

データの機密性が高くない場合は、これが最適なオプションです。ナビゲーション パラメーターはオープンのままにして、2 番目のビュー モデルで値を慎重に処理します。つまり、ビュー モデルが任意の値を適切に処理できるように設計します。ユーザーがパラメーター値を直接変更した場合でも、ビュー モデルはそれを正しく処理できる必要があります。

URL パラメーターを直接設定できると有利な場合がありますが、値を使用する前に値の整合性を確保するように注意する必要があります。

ただし、パラメーターを非表示にする必要がある場合は、いくつかの異なるオプションがあります。

暗号化: tea.js などの暗号化ライブラリを使用し、ナビゲーションのパラメーター値として追加する前に値を暗号化します。次に、もちろん、使用する前に 2 ページ目で復号化します。これにより、Durandal のrouterナビゲーションは正常に機能し、ユーザーが独自の値を指定することはできなくなります。

ユーザーが独自の値を入力できないようにする必要があり、余分な数 KB のオーバーヘッドを許容できる場合は、渡す必要があるパラメーターが数個だけである限り、これは適切なアプローチです。

共有データ モデル: 2 つのビュー モデル間で共有されるシングルトン モデルを使用します。このモデルは、必要に応じて手動で作成できrequired()、基本的に、1 つ以上のビュー モデル間で共有されるアプリケーション状態のリポジトリとして機能します。これは問題なく動作しますが、大きなグローバル変数を持つようなものです - 使いすぎると厄介になる可能性があります.

VM を直接変更する: (シングルトン ビュー モデルの場合のみ) 2 番目のビュー モデルを 手動で変更require()し、そのプロパティに移動する前にそのプロパティを設定します。

于 2013-05-03T11:51:42.490 に答える