我有一个非常复杂的类,所以我决定闯入子模块并尝试使用揭示模块模式。 我有主类,并决定分成较小的容器功能。但在目前的情况下
但我无法使用searchFinder.Search.callSearchResultWithCallBack()从外部访问任何内部函数,即callSearchResultWithCallBack。我应该使用哪种模式来保持代码清洁,并且可以控制在子模块中调用内部函数。
由于
var searchFinder;
function SearchFinder() {
me = this;
this.searchResult = null;
this.init = function() {
declareControls();
createAccordian();
addEvents();
fillControls();
var declareControls = function() {
this.SearchButtons = jQuery('.doSearch');
this.InputLocation = jQuery('#inputLocation');
this.InputDistanceWithIn = jQuery('#inputDistanceWithIn');
this.InputName = jQuery('#inputName');
}
var addEvents = function() {
me.SearchButtons.click(function() {
me.Search();
});
}
var fillControls = function() {
var getGetCategory = function() {
}
}
}
this.Search = function() {
var url = '';
var searchCriteria = {};
validateAndCreateCriteria();
callSearchResultWithCallBack();
function validateAndCreateCriteria() {
function validateAandGetCategory() {
if (SearchValidation.ValidateZipCode(me.InputLocation.val().trim())) {
searchCriteria.location = me.InputLocation.val().trim();
} else if (SearchValidation.ValidateCityState(me.InputLocation.val().trim())) {
searchCriteria.location = me.InputLocation.val().trim();
}
}
}
// need to access it outsite
function callSearchResultWithCallBack() {
me.searchResult(searchCriteria, SearchResultCallBack);
function SearchResultCallBack() {
}
}
}
}
jQuery(function() {
searchFinder = new SearchFinder();
searchFinder.init();
searchFinder.Search.callSearchResultWithCallBack();
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
&#13;
答案 0 :(得分:0)
此代码有多个问题,首先我将解决例如declareControls
未执行的问题。首先声明函数而不是执行!
this.init = function() {
var declareControls = function() {
this.SearchButtons = jQuery('.doSearch');
this.InputLocation = jQuery('#inputLocation');
this.InputDistanceWithIn = jQuery('#inputDistanceWithIn');
this.InputName = jQuery('#inputName');
}
var addEvents = function() {
this.SearchButtons.click(function() {
me.Search();
});
}
var fillControls = function() {
var getGetCategory = function() {
}
}
declareControls();
//createAccordian(); //not defined
addEvents();
fillControls();
}
现在让我们看看将出现的其他问题。
引用它的me
对象在searchFinder
范围内,并且在searchFinder实例中不引用相同的this
。
函数jQuery
可以替换为常用的$
。
searchFinder.Search.callSearchResultWithCallBack()
这永远无法奏效。由于Search
函数是一个对象,callSearchResultWithCallBack
不是此函数的属性。
溶液;使其成为搜索原型的一部分。
步骤:
callSearchResultWithCallBack
移到搜索功能之外。function callSearchResultWithCallBack() {
me.searchResult(searchCriteria, SearchResultCallBack);
function SearchResultCallBack() {
}
}
this.Search.prototype.callSearchResultWithCallBack = callSearchResultWithCallBack;
如果你想在搜索之外触发此功能,请使用:
searchFinder.Search.prototype.callSearchResultWithCallBack();
请记住,callSearchResultWithCallBack
会抛出错误,因为searchCriteria
未定义。
现在解决了您的问题,但必须彻底修改此代码。但这应该让你开始。 http://ejohn.org/blog/simple-javascript-inheritance/