3

readyオブジェクト内の関数を呼び出すことによってビューを初期化する単純なjQueryイベントがありsetupViewます。

私が持っている質問は、以下に示すように関数setSomethingImportantから関数を呼び出す適切な方法は何ですか?init

呼び出しは関数とは異なる実行コンテキストから行われるため、init機能this.setSomethingImportant()しません。ただし、を使用すると機能しますsetupView.setSomethingImportant()。これに関する問題は、変数名(setupView)が変更された場合、コードの本体も変更する必要があることです。

   (function() {        
        $(document).ready(function() {              
            setupView.init();               
        });     
         var setupView = {          
            currentState : "CT",            
            init : function () {
               $("#externalProtocol").change( function () {
                    console.log("Changed =" + $(this).val());
                    setSomethingImportant(); 
                               // Question ? how to call a method in the setupView object   
                });         
             },         
             setSomethingImportant : function () {
                 this.currentState="TC";    
                 console.log("Something has changed :" + this.currentState );
             }      
         }  
 }(jQuery);
4

3 に答える 3

3

変数に格納thisします:

var setupView = {
    currentState: "CT",
    init: function() {
        // Keep a reference to 'this'
        var self = this;
        $("#externalProtocol").change(function() {
            console.log("Changed =" + $(this).val());

            // Use the old 'this'
            self.setSomethingImportant();
        });
    },
    setSomethingImportant: function() {
        this.currentState = "TC";
        console.log("Something has changed :" + this.currentState);
    }
};

作業デモを参照してください。

于 2012-08-09T16:09:31.980 に答える
1

Please note that I changed my original solution. I am now passing data to the event handler using even.data.

(function() {        
    $(document).ready(function() {              
        setupView.init();               
    });     
    var setupView = {          
        currentState : "CT",            
        init : function () {
            $("#externalProtocol").change({ _this: this }, function (event) {
                console.log("Changed =" + $(this).val());
                event.data._this.setSomethingImportant(); 
            });         
        },         
        setSomethingImportant : function () {
            this.currentState="TC";    
            console.log("Something has changed :" + this.currentState );
        }      
    }  
 }(jQuery);
于 2012-08-09T16:11:34.797 に答える
1

関数を個別に宣言してから、次のように呼び出します。

function setSomethingImportant(context) {
    context.currentState="TC";    
    console.log("Something has changed :" + context.currentState );
};

(function() {        
        $(document).ready(function() {              
            setupView.init();               
        });     
         var setupView = {          
            currentState : "CT",            
            init : function () {
               $("#externalProtocol").change( function () {
                    console.log("Changed =" + $(this).val());
                    setSomethingImportant(this); 
                               // Question ? how to call a method in the setupView object   
                });         
             },         
             setSomethingImportant : function () {
                 setSomethingImportant(this);
             }      
         }  
}(jQuery);
于 2012-08-09T16:09:30.560 に答える