0

JSFiddle在这里:http: //jsfiddle.net/sandalsoft/eU8ua/

我的应用程序对 instagram 进行 ajax 调用以获取用户的 instagram 提要,并在用户没有会话时重定向以进行身份​​验证。Instagram 在access_token无效时返回 HTTP 400,我想根据该 400 状态代码进行重定向。但是当 $.ajax() 返回 400 响应时,它并没有被events:路由中的钩子处理。我在setupController()处理它的方法中有代码,但感觉不对。

events:处理这些 HTTP 代码和放置重定向/转换逻辑的正确位置是否正确?如果是这样,有什么想法为什么它不起作用?如果没有,是否有更好的方法来完成我正在尝试做的事情。

App = Ember.Application.create();

App.Router.map(function() {
  this.resource("instagram");
});

App.IndexRoute = Ember.Route.extend({ 
    redirect: function() {
      this.transitionTo('instagram');
    }
});

App.InstagramRoute = Ember.Route.extend({
    events: {
        error: function(reason, transition) {
            console.log('err.  reason.status: ' + reason.status);
            if (reason.status === 400) {
                console.log('in evetns hook.  Unauthorized, redirecting to: ' + App.Instagram.authURL);
                this.transitionTo(App.Instagram.authURL);
            } else {
                console.log('err.  reason.status: ' + reason.status);
            }
        }
    },
    setupController: function(controller) {
        $.ajax({
            url:"https://api.instagram.com/v1/users/1574083/?access_token=NO_TOKEN",
            type:'GET',
            dataType:'JSONP',
            }).then(function(json){
                if (json.meta.code ===400) {
                    console.log('in setupController ERROR 400: json: ' + JSON.stringify(json));
                }
                else {
                    controller.set('model', json.data);
                }   
        });
    }
});

App.Instagram = Em.Object.extend({

});

App.Instagram.reopenClass ({

    authURL: 'https://instagram.com/oauth/authorize/?client_id=' + App.Instagram.clientId + '&redirect_uri=' + App.Instagram.redirectUri + '&response_type=token',
    token: localStorage.Instagram_token,
    tokenChanged: function() {
       localStorage.token = this.get('Instagram_token');
     }.observes('token')
});

更新:instagram 网络服务器返回 HTTP 200,但响应 JSON 错误代码是 400。所以我可以看到events:钩子可能不会触发,但在我的 setupController 中处理所有 4xx 应用程序错误代码是否仍然合适( ) 方法?

4

1 回答 1

2

我建议做这样的事情:

App.InstagramRoute = Ember.Route.extend({
  events: {
      error: function(reason, transition) {
          console.log('err.  code: ' + reason.code);
          if (reason.code === 400) {
              console.log('in evetns hook.  Unauthorized, redirecting to: ' + App.Instagram.authURL);
              this.transitionTo(App.Instagram.authURL);
          } else {
              console.log('err.  reason.code: ' + reason.code);
          }
      }
  },
  model: function(params, transition) {
      var promise = new Ember.RSVP.Promise(function(resolve, reject){
          $.ajax({
            url:"https://api.instagram.com/v1/users/1574083/?access_token=NO_TOKEN",
            type:'GET',
            dataType:'JSONP',
            }).then(function(json){
                if (json.meta.code ===400) {
                    console.log('ERROR 400: json: ' + JSON.stringify(json));
                    reject(json.meta);
                }
                else {
                    resolve(json.data);
                }   
        });
      })
      return promise;
  }
});

我不知道该代码是否有效,但它可以给你一个提示。

于 2013-08-27T21:17:09.657 回答