我很贪图并试图通过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');
}
});
我无法理解它。
非常感谢任何帮助。感谢
答案 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
对象。
如果您希望能够在发生某些事件时收到通知,例如login
,logout
等,您应该(正如插件的作者在其博客文章中所述)覆盖{{ 1}}方法并在那里进行转换。
由于插件是我们updateFBUser
命名空间中可用的mixin,因此您应该可以执行以下操作:
App
希望它有所帮助。
答案 1 :(得分:0)