8

複数のマスター ビューを使用したい SPA に取り組んでいます。これが私のユースケースです:

プロフィール ページを持つユーザーがいます。そのプロファイル ページ内で、いくつかの異なるビューを表示できるようにしたいと考えています。詳細、作品、連絡先情報など。これらのビューのそれぞれにディープ リンクできるようにする必要があります。これらの各ビューは、マスター レイアウト ビューからの基本的なユーザー データを表示する必要があります。

これには構成を使用する必要があることを理解しており、動作するように見えるコードが少しありますが、「セカンダリシェル」から実際のサブビューにデータを渡すことができるようにしたいと考えています。サブビューモデルの activate メソッドにスプラットデータが渡されていないようです。

私の「マスター」ビューモデルでは、サブ ビューモデル (viewmodels/user/details) に対応する文字列を含む、activeView と呼ばれるオブザーバブルを作成しました。次に、次のようなノックアウトステートメントがあります。

<!-- ko compose: {
    model: activeView(),        
    activate: true
} --><!-- /ko -->

サブビューにデータを渡すにはどうすればよいですか? または、これを行うより良い方法はありますか?

前もって感謝します!

4

2 に答える 2

1

私によると、ko.compose はそれほど動的ではなく、Razor のレイアウトのように機能するようです。durandal では、できるだけ別のビューを作成してから、それらをルーターにリンクすることをお勧めします。私は John Papa の Hot-Towel テンプレートを使用しています。私の提案は、durandal ルーターとノックアウトを使用して (id を超える) データを渡すことに関するものです。

アプリ (shell.js、main.js、...) を初期化するときに 、最終的にフィルタリングするための設定を使用して、ルートをどこかに (shell.js または main.js) マップします。データを転送するルートについては、(:id) プロポーザルを使用して構築します

router.mapRoute('view/:id', moduleId, 'Customer Details', false);

ルートが必要な場所と時期 ジョセフ ガブリエルのソリューション ( https://stackoverflow.com/a/16036439/2198331 ) を参照して、必要な場所とタイミングでルートをフィルター処理できます。ルートをフィルタリングした後、routeInfoをハックしてパラメーター (文字列または selectedItem などのオブジェクト) を転送できます。

arearoutes = ko.utils.arrayFilter(router.visibleRoutes(), function (route) {
              // mgpe has been set at app init
                return route.settings.mgpe === 112; 
             });

転送するデータを使用して、フィルターの結果から routeInfo を拡張します

areaRoutes.forEach(function(ar){
     ar.myItem = mydata; // or vm.selectedItem(); DEPARTURE LUGGAGE
}, areaRoutes);

あなたの(myItem)はこれらのルートにアタッチされているので、 これまたはこれらのルートはデータを一緒に運び、ルーターの同じオブジェクト(myItem)を更新しない限り、データを失うことはありません

function activate(adata){
       vm.arrivalData(adata.routeInfo.myItem);  // ARRIVAL LUGGAGE are here
}

ルートはネストされたルートを運ぶことができます ネスト されたメニューのようなネストされたコンテキストに役立ちます。親ルートがアクティブなときに旅行を準備することで、子供のルートで遊ぶことができます。

router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) {
   mybag = activationData.routeInfo; // TRAVEL (current) LUGGAGE are present here
}

注意:この回避策を使用する前に、セキュリティの問題を考慮する必要があります。私は durandal を初めて使用するため、これがルーターのルート ライフサイクルに重大な結果をもたらさないかどうかはわかりません。また、ルーターのルートが存続している間はオブジェクトが永続的に存在するため、オブジェクトの名前にも注意してください。

于 2013-05-09T23:24:15.967 に答える
0

ユーザー オブジェクトを作成し、各ビューモデル内でそれを要求するのはどうですか? 簡単なことは、それをアプリにアタッチすることです (つまり、 app.user = )。前述のユーザー オブジェクトのオブザーバブルに加えられた変更は、SPA 内の各ビューとビューモデルに更新されます。

そうすれば、ノックアウト ライブラリのサブ/パブの機能を活用できます。

于 2014-01-15T21:07:09.873 に答える