2014-10-29 92 views
0

解決!看到問題的結尾,我用的結果jQuery關不工作,因爲我預期

我想寫一個函數,可以處理我的應用程序按路徑分頁。

我有一個函數route()被調用,參數是要移動到的路徑(頁面)。

route是一個對象,它定義了一個處理其邏輯的模型。 此模型包含3個功能 indexAction - 這呈現我的看法,並將其附加到我的頁面。 bindEvents - 這是我已經把我所有的點擊事件 關機 的 - 這是指令轉移到一個新的頁面

路由功能首先運行關閉當前頁面上運行時,在這裏我有$ (選擇).off()和$(選擇)一個.remove()

它然後運行enidexAction和bindEvents功能。

我現在的問題是,當我回到這個頁面,我所有的點擊功能都運行兩次,然後三次等等......它好像斷()從來沒有真正從錨解除綁定。

這裏是我的模型

var NewPageModel = (function() { 
var instance; 
var modal = 'null'; 
function createInstance() { 
    var object = { 
     indexAction: indexAction, 
     shutDown: shutDown, 
     bindEvents: bindEvents 
    }; 
    return object; 
} 

function indexAction (data, callback){ 
    var partials = {}; 
    ViewManager.render('pageName',{context:data}, partials,function(html){ 
     ViewManager.appendUnique('#xxx',html,'uniqueID'); 
     callback(); 
    }); 
} 

/** 
* Remove modal 
*/ 
function shutDown(){ 
    this.modal.off(); 
    this.modal.remove(); 
} 

function bindEvents() { 
    if(this.modal!='null'){ 
     return; 
    } 
    this.modal = $(PagerManager.pages.newGroup.id); 

    this.modal.on('click','div.close', function() { 
     shutDown(); 
    }); 

    this.modal.on('click', 'button.cancel', function() { 
     shutDown(); 
    }); 

    this.modal.on('click', 'button.submit', function() { 
     //code that submits form information 
    }); 
} 

return { 
    getInstance: function() { 
     if (!this.instance) { 
      this.instance = createInstance(); 
     } 
     return this.instance; 
    } 
}; 
})(); 

編輯之一的例子! 所以我仍然在學習有關範圍的重要性,以及如何可以應用到的功能 這裏是工作的代碼 VAR NewPageModel =(函數(){ VAR實例; VAR模態; 功能的createInstance(){ VAR對象= { 的indexAction:的indexAction, shutdown:關閉, bindEvents:bindEvents }; 返回對象; }

function indexAction (data, callback){ 
    var partials = {}; 
    ViewManager.render('pageName',{context:data}, partials,function(html){ 
     ViewManager.appendUnique('#xxx',html,'uniqueID'); 
     callback(); 
    }); 
} 

/** 
* Remove modal 
*/ 
function shutDown(){ 
    this.modal.off(); 
    this.modal.remove(); 
    this.modal = null; 
} 

function bindEvents() { 
    //This is confused logic, if I use off() in shutdown, I don't need to do this as I need to bind all the events again. hence in shutdown modal=null; 
    if(!this.modal){ 
     return; 
    } 
    this.modal = $('#modal'); 

    this.modal.on('click','div.close', function() { 
     shutDown().apply(this); 
    }).bind(this);; 

    this.modal.on('click', 'button.cancel', function() { 
     shutDown().apply(this); 
    }).bind(this);; 

    this.modal.on('click', 'button.submit', function() { 
     //here I only use the apply(this) if I use another internal function 
     //code that submits form information 
    }).bind(this);; 
} 

return { 
    getInstance: function() { 
     if (!this.instance) { 
      this.instance = createInstance(); 
     } 
     return this.instance; 
    } 
}; 
})(); 
+3

'如果(!this.modal = '空'){'真的花花公子? – AlienWebguy 2014-10-29 17:05:36

+1

@AlienWebguy請提供一個更好的評價這個建議。我不是一個JavaScript開發人員,我正在嘗試...... – Beyerz 2014-10-29 17:09:29

+0

除了JavaScript之外,存在'null'是因爲編程的原因 – AlienWebguy 2014-10-29 17:11:42

回答

1

在保持你的語法和精神只是修復bug,

if(this.modal!='null'){應該if(modal!='null'){

因爲this.modalundefined在這個條件下,將剛剛返回。

本着修復代碼的精神,您需要保留對this的引用,否則它將在瀏覽器中默認爲window

var modal; 
function createInstance() { 
    var object = { 
     modal : modal, 
     shutDown: shutDown, 
     bindEvents: bindEvents 
    }; 
    return object; 
} 

function bindEvents() { 
    if(this.modal){ 
     return; 
    } 

    // ..... // 
    this.modal.on('click','div.close', function() { 
     shutDown.apply(this); 
    }.bind(this)); 

    // ..... // 
} 

工作演示:

http://jsfiddle.net/uyovgdj3/

+0

由於model是一個在函數/對象上初始化的屬性,它確實需要引用this.modal?我看到你的JSFiddle對於這個檢查是正確的('if(this。模式)') – 2014-10-29 17:34:10

+0

所以如果我理解正確,我只需要將範圍綁定到需要範圍的函數,在這個例子中是關閉函數。或者我是否還需要將範圍綁定到.on('click'...鍵入事件,如我的提交按鈕不會調用關閉功能? – Beyerz 2014-10-29 19:11:47

+0

我選擇使用此解決方案,因爲它很容易理解關係範圍以及它完全符合我的情況。感謝您的幫助! – Beyerz 2014-10-29 19:27:54

2

你正在失去你的this在事件處理程序的功能(this將是元件點擊)所以shutDown是沒有得到正確的this

this.modal.on('click','div.close', function() { 
    shutDown(); 
}); 

應該是:

var self = this; 
this.modal.on('click', 'button.cancel', function() { 
    self.shutDown(); 
}); 

例如

function bindEvents() { 
    var self = this; 
    if(this.modal!='null'){   /// <<<< !!!!!! WTF 
     return; 
    } 
    this.modal = $(PagerManager.pages.newGroup.id); 

    this.modal.on('click','div.close', function() { 
     self.shutDown(); 
    }); 

    this.modal.on('click', 'button.cancel', function() { 
     self.shutDown(); 
    }); 

    this.modal.on('click', 'button.submit', function() { 
     //code that submits form information 
    }); 
} 

注:我忽略字符串比較null現在,因爲我不知道你在做什麼有:)

正如評論所指出的@Gurami Dagundaridze你也可以保持正確this使用bind(我認爲的語法是這樣的):

this.modal.on('click', 'button.cancel', shutDown.bind(this)); 
+0

是不是更好使用bind()? – guramidev 2014-10-29 17:20:32

+0

@True,但這並不能解釋他的多重約束力,這是他所問的。但無論哪種方式,解決這個問題的更好辦法是做'this.modal.on(「click」,「div.close」,shutDown);'然後改變'shutDown'做'$(this).off ()卸下襬臂()'。 – 2014-10-29 17:21:14

+0

@squint:如果他的'shutDown'沒有用正確的'this'調用,那麼它將不會斷開處理程序(這將解釋倍數)。 – 2014-10-29 17:22:03