我正在學習JavaScript,並以我想了解更多關於jQuery的方式。我已經創造了JS一個非常簡單的「形式控制器」,所以當我創建傳遞形式參數的對象時,它得到的事件有線和劫持提交:jQuery擴展和關閉
var FormController = function (form) {
// private field
var _form = $(form);
var _url = _form.attr('action');
var _isValid = false;
$(form).submit(function (e) {
submitForm();
e.preventDefault();
});
var disableAll = function() {
_form.find('select,input,textarea').attr('disabled', 'disabled')
};
var enableAll = function() {
_form.find('select,input,textarea').removeAttr('disabled')
};
var submitForm = function() {
disableAll();
_isValid = true;
if (_isValid) {
$.ajax({
url: _url,
type: 'POST',
success: function (data, textStatus, jqXHR) {
enableAll();
var obj = jQuery.parseJSON(jqXHR.responseText);
print(data.Result ? data.Result : "[No Result]");
print(textStatus.toString());
},
error: function (data, textStatus, jqXHR) {
print(textStatus);
_form.css('border', '1px solid Red');
enableAll();
}
});
}
};
// public fields and functions
return {
getIsValid: function() { return _isValid; },
submit: function() { return submitForm(); }
};
};
它按預期工作。現在,我想創建一個jQuery擴展,這樣我就可以申請該對象的結果:
$.fn.formController = function() {
return this.each(function (i, item) {
new FormController(item);
});
};
我也工作正常,但是......將在GC收集對象?或者因爲這些事件是有線的,它會被視爲參考?
現在,我想保留我的控制器的實例可用,所以我可以在創建後操作它們,例如調用方法。這樣的事情:
$('#myForm').formController('submit');
我已經嘗試了幾種方法來做到這一點,但我無法得到它。我試圖用一個跟蹤項目的對象來放置一個閉包,但是我只是因爲「這個」而陷入混亂。
這樣做的正確方法是什麼?而且我認爲,即使它有效,我迄今所做的一切都可能是錯誤的。
謝謝。
UPDATE
很抱歉,如果這個問題還不夠清楚。我的目標是我可以做到的一種方式:$('#myForm').formController('submit');
,然後funcion會找到與該HTML對象關聯的「FormController」對象,並調用這個「submit」成員。
我要實現的是這樣的:
$.fn.formController = function (name) {
if(!document._items)
document._items = [];
if (name) {
return this.each(function (i, item) {
var id = $(item).data('form-controller');
if (id) {
var fc = document._items[id];
var member = fc[name];
if (member) {
if (typeof member == 'function')
member();
}
}
});
}
else {
return this.each(function (i, item) {
var id = document._items.push(new FormController(item)) - 1;
$(item).data('form-controller', id.toString());
});
}
};
這種方法的問題是,我讓一個集合作爲全局對象,而我要的是讓內部。我嘗試過使用閉包,但是我只遇到了「this」(指向DOMwindow)或「_items」變量爲空的問題。
什麼是正確的方法來解決這個問題?
謝謝。第二個例子不起作用,首先是因爲在「FromController」中有一個輸入錯誤:D但是也是因爲「arguments [0]」總是「0」,它不包含'submit'項。任何想法爲什麼會發生這種情況? – vtortola
哦,'arguments'指的是傳遞給'each()'函數的參數。我更新了代碼來解決這個問題。 – shesek
再次更新了代碼,它缺少名稱空間的小部件名稱 – shesek