0

JSFiddle はこちら: http://jsfiddle.net/sandalsoft/eU8ua/

私のアプリは、instagram への ajax 呼び出しを行ってユーザーの instagram フィードを取得し、ユーザーがセッションを持っていないときにリダイレクトして認証します。無効な場合、Instagram は HTTP 400 を返しますaccess_token。その 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 Web サーバーは HTTP 200 を返していますが、応答の JSON エラー コードは 400 です。したがって、events:フックがトリガーされない可能性があることがわかりますが、setupController( ) 方法?

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 に答える