1

Ember JS で、新しく入力されたルートのビューが前のルートのビューを部分的にスライドするスライド UI を作成したいと思います。ルートは、異なるモデルで複数回アクティブにできる必要があります。例については、この投稿の最後を参照してください。

これを Ember ルーティングおよびレンダリング システムに適合させるのに問題があります。これまでに試したことについては、この JSFiddle を参照してください。基本的にランダムな ID を持つ新しいパネル ルートにリンクします。

新しいビューを通常の OutletView ではなく ContainerView にレンダリングする containerOutlet ヘルパーを作成しました。これは機能しますが、同じ「パネル」ルートに入ると、新しいコントローラー/ビューのペアは作成されず、現在のモデルのモデルが変更されるだけです。

代わりに、新しいコントローラー/ビューのペアをインスタンス化して、ContainerView アウトレットにレンダリングすることは可能でしょうか?

Ember はこのように設計されていないように感じます。私はシステムと戦っています。そのため、ヒントや説明があれば役に立ちます。


Spotify は、Web プレーヤーでこれを非常に上品に行っています。よりよく説明するために、いくつかのスクリーンショットを添付しました。

基本的に、新しいルートに移行するときは、前のルートをスライドする新しい「レイヤー」にレンダリングされます。変更前の画像と変更後の画像を比較します。

前のビューはまだそこにあり、前のルートをクリックすると、アプリケーションは元に戻ります。これを無制限に繰り返すことで、「ルート」履歴を保持する階層化された UI を作成できます。


コード

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

App = Ember.Application.create({});

App.Router.map(function () {
    this.route("panel", {
        path: "/:panel_id"
    });
});

App.IndexRoute = Ember.Route.extend({
    model: function () {
        random = getRandomInt(1, 10);
        return { nextPanelId: random };
    }
});

App.PanelRoute = Ember.Route.extend({
    model: function (params) {
        random = getRandomInt(1, 10);
        return {
            id: params.panel_id,
            nextPanelId: random
        };
    }
});

Ember.Handlebars.registerHelper('containerOutlet', function (property, options) {
    //(..)
    //Only this line has been changed
    return Ember.Handlebars.helpers.view.call(this, Ember.ContainerOutletView, options);
});

Ember.ContainerOutletView = Ember.ContainerView.extend({
    //For some reason it breaks when I remove this observer
    _currentViewWillChange: Ember.beforeObserver(function () {}, 'currentView'),

    _currentViewDidChange: Ember.observer(function () {
        this.pushObject(this.get('currentView'));
    }, 'currentView')
});
4

0 に答える 0