ember.js未捕获的TypeError:对象数据大小没有方法'transitionTo'

时间:2013-08-24 23:20:23

标签: javascript facebook facebook-graph-api ember.js

我很贪图并试图通过facebook实现身份验证

我正在使用ember-facebook.js库来连接facebook。验证成功后,我想转换到其他路线,例如'/指数'。该库在mixin中创建一个App.FBUser对象,该对象从facebook响应中填充。该博客说:

  

每当用户更改(登录,注销,应用程序授权等)时,都会调用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'我的索引路由时,我得到以下错误 未捕获的TypeError:对象数据大小没有方法'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');
  }
});

我无法理解它。

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

  

如何在Route.beforeModel()钩子中访问此对象。

根据你所谈论的beforModel钩子的路线,你可以这样做:

App.SomeRoute = Ember.Route.extend({
  beforeModel: function(transition) {
    if (!Ember.isNone(App.FBUser)) {
      // calling 'transitionTo' aborts the transition, redirects to 'index'
      this.transitionTo('index');
    }
  }
});

更新以回应您的上次评论

您正在使用的插件稍微过时,您的应用程序中mixin的建议实现方法将无法与当前版本的ember一起使用:

App = Ember.Application.create(Ember.Facebook)
App.set('appId', 'yourfacebookappid');

从ember的1.0.0-rc3版本开始,你应该这样做:

App = Ember.Application.creatWithMixins(Ember.Facebook);
App.set('appId', 'yourfacebookappid');

之后,您应该能够访问上面提到的App.FBUser对象。

更新2

如果您希望能够在发生某些事件时收到通知,例如loginlogout等,您应该(正如插件的作者在其博客文章中所述)覆盖{{ 1}}方法并在那里进行转换。

由于插件是我们updateFBUser命名空间中可用的mixin,因此您应该可以执行以下操作:

App

希望它有所帮助。

答案 1 :(得分:0)

根据Issue 1添加

attributeBindings: [],

到:

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

解决了这个问题。