5

サインインしたユーザーのみが利用できる多くのオプションを備えたインタラクティブな Ember アプリがあります。たとえば、投稿のリストがあり、ユーザーに関連する私の投稿への別のリンクがある場合があります。

私の頭に浮かぶ2つの問題があります:

  • ユーザーがログインしているかどうか、そしておそらく彼のデータをアプリに伝えるにはどうすればよいですか?
  • ログイン状態に基づいて特定の機能やアイテムを非表示にするにはどうすればよいですか?

これにアプローチするためのベストプラクティスはありますか? ログインプロセス自体はそれほど複雑ではないと思いますが、if logged_in? do_x else do_y私にとっては大きな未知数です. グローバル ユーザー状態はどこに保存すればよいですか?

4

1 に答える 1

2

ember ルーターを使用している場合、私の提案は、このようなソリューションを構築することです。

ログインコントローラ

App.LoginController = Ember.Controller.extend({
    login: function(params){ /* Your logic here */ },
    logout: function(params){ /* Your logic here */},

    user_data_hash: { first_name: "The", last_name: "Hobbit"},

    is_logged_in: (function() {
        /* do some logic and return true or false */
    }).property('some_item_on_user_data_hash')

    just_logged_in: (function() {
        /* do some logic and return true or false */
    }).property('some_item_on_user_data_hash')

次に、保護されたルートへのナビゲーションを許可する前に、ルーターでLoginControllerオブジェクトを確認します。この例は、この回答から取ったものです。

root: Ember.Route.extend({
    index: Ember.Route.extend({
        enter: function(router) {
            var logged_in = router.get('loginController.is_logged_in'); /*Or in older ember builds `router.getPath('loginController.is_logged_in');`*/
            var just_logged_in = router.get('loginController.just_logged_in'); /*Or in older ember builds `router.getPath('loginController.just_logged_in');`*/
            Ember.run.next(function() {
                if (logged_in && just_logged_in) {
                    router.transitionTo('loggedIn');
                } else if (!logged_in) {
                    router.transitionTo('loggedOut');
                }
            });
        }
    }),

    loggedIn: Ember.Route.extend({
        // ...
    }),

    loggedOut: Ember.Route.extend({
        // ...
    })
})
于 2012-12-17T15:20:25.653 に答える