1

Web サービスとやり取りするための Javascript SDK を作成しています。AJAX 呼び出しを行うために jQuery を使用しています。

AJAX 呼び出しが失敗した場合、.js ファイルの先頭で呼び出される ajaxError のイベント ハンドラーを登録しました。私の問題は、理由がわかりませんが、呼び出されたときに、Akamanda.Client のクラス メンバー変数にアクセスする方法がないことです。

Akamanda.Client の別のメソッドを .prototype.logError として追加しようとしましたが、これは jQuery Ajax ハンドラーによって呼び出されましたが、それでも (this.logging) のテストは失敗しました。

jQuery コールバックからクラス メンバー変数にアクセスするにはどうすればよいですか? ここで何が理解できていないのですか?Akamanda.Client.logging は ajaxError コールバックから未定義です。

SDK の私のコード:

$(document).ajaxError(function(event, jqxhr, settings, exception) {
    // more robust error handling for different conditions
    if (Akamanda.Client.logging) {
        console.log('FAILED: ' + settings.type + ' ' + settings.url + ' => ' + exception);
    }
});

Akamanda.Client = function(options) {

    this.URL = options.URL || 'http://m-test.akamanda.com';
    this.baseURL = this.URL + '/api/' + Akamanda.API_VERSION;
    this.feedsURI = '/websyndication/feed/';

    // who is the client? (iphone/android/web)
    this.clientName = options.clientName;

    // For development: Logging and buildcurl IS ON, for production: OFF
    //this.logging = options.logging || true;
    this.logging = true;

    // called when a user is not authorised (Disabled)
    // this.logoutCallback = options.logoutCallback || null;
}

Akamanda.Client.prototype.getFeeds = function(callback){
    var feeds = [];
    $.getJSON(this.baseURL + this.feedsURI, function(data) {
        $.each(data, function(index, feed) {
            feeds[index] = {
                name: feed.name,
                title: feed.title,
                link: feed.link
            };

        })
        callback(feeds);
    });//.error(function(err) { (disabled at the moment in favour of ajaxError event)
       //     console.log('Error: ' + err.error);
       // });    
}

クライアント用の私のコード (別の JS ソース ファイル内):

var options = { logging: true };
myAPI = new Akamanda.Client(options);
var feeds = [];
var articles = [];

function getFeeds()
{
    myAPI.getFeeds(function(AkamandaFeeds) {
        feeds = AkamandaFeeds;
        showFeeds();
    });
}
4

1 に答える 1

0

あなたが投稿したコードからわかる限り、タイプ Akamanda.Client のオブジェクトをインスタンス化することは決してありません。

var Client = new Akamanda.Client();

また

var Akamanda.Client = {};

Akamanda.Client.logging = ....

JSBin の例: http://jsbin.com/ajidig/1/edit

わかりました、ここに少し例を示します(実際のコードですが、非常に単純化されています):

//we wrap our code in a self invoking function so that we don't pollute the global    namespace, see http://stackoverflow.com/questions/6715805/self-invoking-functions-javascript for further details
(function(){
     //create your object that holds all your function, that are different ways to do this
     var Akamanda = {};

     //a private function 
     function ErrorHandler(clientObj) {
          this.clientObj = clientObj;
          //do whatever with clientObj
          this.log = function(){..}
     } 
      //private constructor for clientobj
     function Client(options){
         ..
     }



     Akamanda.Client = function(){

       var newClient = new Client({..});
       //setup
       Akamanda.ErrorLogging = new ErrorHandler(newClient);
       return newClient;
     }

     //bind our service to the window object to make it accesible

     window.Akamanda = Akamanda;
})()


//client

var myAPI = Akamanda.Client();
Akamanda.ErrorLogging.log();

この基本的な例が役立つことを願っています。Javascript パターンについて詳しく知る必要がある場合は、jQuery の作成者である John Resig によるhttp://jsninja.com/の本をお勧めします。やりたいことに応じて、http://backbonejs.org/のように、この種の作業に役立つフレームワークもたくさんあります。

于 2013-05-16T06:45:25.210 に答える