1

ユーザーが編集を追加し、親子を組み合わせて表示できるページを作成しようとしています。

UI には 3 つの列があります Parent : 親のリスト Children : Child

ユーザーが元の場所に戻ることができるようにコントローラーを構成したいのですが、親と子の両方を編集できるようにする必要はありません。

// バックボーン マリオネットを使用して近づいていますが、まだいくつかの小さな問題があります

    MyRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            '': 'AddClient',
            'View/:clientid': 'ViewClient',
            'Edit/:clientid': 'EditClient',
            'View/:clientid/Add': 'PolicyAdd',
            'View/:clientid/View/:policyid': 'PolicyView',
            'View/:clientid/Edit/:policyid': 'PolicyEdit'
        }
    });

    someController = {
        AddClient: function () {
            var someView = new ClientAdd();
            MyApp.clientPane.show(someView);
        },
        ViewClient: function (clientid) {
            var someView = new ClientView();
            MyApp.clientPane.show(someView);
        },
        EditClient: function (clientid) {
            var someView = new ClientEdit();
            MyApp.clientPane.show(someView);
        },
        PolicyAdd: function (clientid) {
            this.ViewClient(clientid);
            var someView = new PolicyAdd();
            MyApp.policyPane.show(someView);
        },
        PolicyView: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyView();
            MyApp.policyPane.show(someView);
        },
        PolicyEdit: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyEdit();
            MyApp.policyPane.show(someView);
        }
    };

「this.ViewClient」を持つことはハックに感じられ、機能しません。

4

1 に答える 1

8

マルチパートの回答、ここ...

「this.ViewClient は関数ではありません」

これはマリオネットのバグです。コントローラーメソッドはコントローラーではなくルーターのコンテキストで呼び出されるため、への呼び出しthis.ViewClientはルーター上でそれを見つけようとします。

おっとっと。

バグが記録されました。できるだけ早く修正します。https://github.com/derickbailey/backbone.marionette/issues/38

--

更新: このバグは Backbone.Marionette https://github.com/derickbailey/backbone.marionetteの v0.5.1 で修正されました。

--

この問題を回避するには、次のようにします。

PolicyEdit: {
  someController.ViewClient();
  // ...
}

それがうまくいかない場合は、Underscore.jsbindまたはbindAllメソッドを使用して、コントローラー関数の正しいバインディングを確保する必要がある場合があります。

バグが修正されたら、これらの回避策は必要ありません...できれば今日/今夜遅くに。

基本的に他のルートを呼び出すことは、複数の領域を操作するための最良の方法ですか?

この質問に対する直接的な答えはノーです。

ただし、この場合、ルートを呼び出していません。コントローラーでメソッドを呼び出しています。それはまったく問題ありません。実際、私はこれをお勧めします。これはオブジェクトの適切な使用法であり、別のルート/ルーター ハンドラーを呼び出す代わりに実行する必要があると私が考えるものの 1 つです。

ルーターとコントローラー

ルーターは機能であり、アーキテクチャ上の要件ではありません。アプリはルーターなしで動作する必要があり、ルーターはブックマークとブラウザーの進む/戻るボタンを使用する機能のみを追加する必要があります。

その哲学を念頭に置いて (物議を醸していることはわかっています)、アプリケーションを正しい状態にするために、あなたが持っているようなコントローラーを使用し、コントローラーで複数のメソッドを呼び出すことは、取るべき正しいアプローチの 1 つです。

このように見てみましょう: アプリからルーターを削除すると、コントローラーのメソッドを直接呼び出さなければならなくなります。コードの重複を防ぐために、1 つのことを非常にうまく実行できる小さなメソッドをコントローラーに多数作成し、それらの小さなメソッドから大きなメソッドを作成する必要があります。

それが役立つことを願っています。:)

于 2012-03-01T15:24:32.373 に答える