سؤال

لقد كنت أعمل مع Getters و Petters لتجنب احتمال استخدام المتغيرات العالمية. ومع ذلك ، لقد واجهت مشكلة. الرمز أدناه ، الذي يعمل بشكل جيد مع متغيرات عدد صحيح ، يلقي استثناء عندما أحاول تشغيل مكالمة AJAX بدلاً من ذلك. هل يمكن لأحد أن يشرح لي لماذا يحدث هذا؟


function Object_XML() {
    me = this;
    me.xml = null;
}

Object_XML.prototype = {

    getXML: function() {
        return me.xml
    },

    setXML: function(data) {
        me.xml = data;  
    },

    loadXML: function() {
        $.ajax({
            type: "GET",
            url: "questions.xml",
            dataType: "xml",
            success: function(xml) {
                me.setXML(xml);         
            } //close success       
        });//close AJAX 
    }//close setXML

};

$(document).ready(function() {  
    var data = new Object_XML();
    alert("This is an " + data.getXML());
    data.setXML();
    alert("This is an " + data.getXML());
});

شكرا ، إليوت بونفيل

هل كانت مفيدة؟

المحلول

لقد ألغت فقط استخدامك للمتغيرات الخاصة مع getters والمستقبين باستخدام me = this; لقد صنعت للتو me متغير عالمي من خلال عدم الاستخدام var. (أي متغير لم يتم تعريفه باستخدام VAR يتم توصيله بمساحة الاسم العالمية)

في حالتك نظرًا لأنك تعمل ضمن نطاق الكائن نفسه ، يمكنك استخدامك فقط this وتجنب me شخصيًا ، أعتقد أنه أمر محير. ولكن إذا كنت تريد التمسك بهذا النموذج ، فاستخدم var me = this;

مثالك غير واضح حقًا ، أين يحدث الخطأ؟ أنت تتصل data.setXml() مع عدم وجود معلمات ، لذلك me.xml سوف يراهن على undefined. هذا أمر متوقع إذا لم تقم بأي شيء إلى هذه الطريقة.

ضع في اعتبارك أيضًا أنه بسبب الطبيعة غير المتزامنة لمكالمتك ، إذا كنت ستفعل شيئًا مثل:

data.loadXml();
console.log("data.getXML();", data.getXML());  // would be undefined

data.getxml () في تلك اللحظة ستظل غير محددة لأنه من المحتمل أن لا تعود مكالمتك غير المتزامنة بعد ، وبالتالي عدم تعيين سمة XML لكائنك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top