0

私は非常に新しく、Facebook経由で認証を実装しようとしています

Facebookに接続するためにember-facebook.jsライブラリを使用しています。認証が成功したら、「/index」などの別のルートに遷移したいと考えています。このライブラリは、Facebook の応答から入力される mixin に App.FBUser オブジェクトを作成します。ブログには次のように書かれています。

ユーザーが変更されるたびに (ログイン、ログアウト、アプリの承認など)、メソッド updateFBUser が呼び出され、アプリケーションの App.FBUser オブジェクトが更新されます。このバインディングでやりたいことは何でもできます。それを観察し、DOM に入れます。

Ember.Facebook = Ember.Mixin.create({
  FBUser: void 0,
  appId: void 0,
  fetchPicture: true,
  init: function() {
    this._super();
    return window.FBApp = this;
  },
  appIdChanged: (function() {
    var _this = this;
    this.removeObserver('appId');
    window.fbAsyncInit = function() {
      return _this.fbAsyncInit();
    };
    return $(function() {
      var js;
      js = document.createElement('script');
      $(js).attr({
        id: 'facebook-jssdk',
        async: true,
        src: "//connect.facebook.net/en_US/all.js"
      });
      return $('head').append(js);
    });
  }).observes('appId'),
  fbAsyncInit: function() {
    var _this = this;
    FB.init({
      appId: this.get('appId'),
      status: true,
      cookie: true,
      xfbml: true
    });
    this.set('FBloading', true);

    FB.Event.subscribe('auth.authResponseChange', function(response) {
      return _this.updateFBUser(response);
    });

    return FB.getLoginStatus(function(response) {
      return _this.updateFBUser(response);
    });
  },
  updateFBUser: function(response) {
    console.log("Facebook.updateFBUser: Start");
    var _this = this;
    if (response.status === 'connected') {
      //console.log(_this);
      return FB.api('/me', function(user) {
        var FBUser;
        FBUser = user;
        FBUser.accessToken = response.authResponse.accessToken;
        if (_this.get('fetchPicture')) {
          return FB.api('/me/picture', function(path) {
            FBUser.picture = path;
            _this.set('FBUser', FBUser);
            return _this.set('FBloading', false);
          });
        } else {
          _this.set('FBUser', FBUser);
          return _this.set('FBloading', false);
        }
      });
    } else {
      this.set('FBUser', false);
      return this.set('FBloading', false);
    }
  }//updateFBUser
});

アップデート :

LoginController に次のオブザーバーを追加すると、App.FBUser 更新イベントをキャプチャできます (ブログで示されているように、FB からの応答を取得した後に更新されます)。このオブザーバー メソッドから、インデックス ルートを 'transitionTo' にしようとすると、 Uncaught TypeError: Object data-size has no method 'transitionTo' というエラーが発生します。以下はコードです

App.LoginController = Ember.Controller.extend({
onSuccess: (function(){
    var self = this;
    /*
        //tried all these method to redirect but error is the same
        var attemptedTransition = this.get('attemptedTransition');
        attemptedTransition.retry();
     */
     /*
    //tried all these method to redirect but error is the same
    var router = this.get('target.router');
    router.transitionTo('index');
    */
    
    //tried all these method to redirect but error is the same
    this.transitionToRoute('index');
}).observes('App.FBUser')
});

インデックス ルート

App.AuthenticatedRoute = Ember.Route.extend({ 
 beforeModel: function(transition){
 var self = this;
 if(!App.FBUser){
  self.redirectToLogin(transition);
 }
},

redirectToLogin: function(transition){
var loginController = this.controllerFor('login');
loginController.set('attemptedTransition', transition);
this.transitionTo('login');
  }
});

私はそれを理解することができません。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

0

問題1の追加に従って

attributeBindings: [],

に:

return Ember.FacebookView = Ember.View.extend({ 

問題を解決しました。

于 2013-08-29T06:02:26.170 に答える