所以我一直在寻找这个,因为它让我头痛无法实现这一点......而且似乎没有像我预期的那样解决方案。
我们假设我们有一个样本PHP
类:
<?php
class SampleClass {
function doA() {
echo 'Hello world';
}
function doB() {
$sampleArray = ['Hey', 'You'];
foreach( $sampleArray as $key => $value ) {
self::doA();
}
}
}
?>
由于foreach循环,此代码将回显Hello World
两次。这很好。
现在我有script
:
function SectionHandler($appWrap) {
this.appWrap = $appWrap;
this.loading = function() {
this.appWrap.addClass('section-loading').html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
}
this.setError = function($info) {
this.appWrap.addClass('section-error').html($info);
}
this.load = function($section) {
var $fileCheck = $.get($section).success(function(){
self.loading();
self.load($section);
}).fail(function(){
self.setError('No se pudo cargar los datos especificados desde ' + $section + ' ;');
});
}
}
我认为由于this.loading()
函数,$.get().success()
不再指向main函数。我不知道真正的原因。
问题在于this.loading(), this.load(), this.setError()
都没有工作。
那么,我是如何指向主函数的,就像我使用PHP self::
函数一样。?
由于@Eclecticist指出行this.load($section);
将执行,直到它失败或出错,我将整个检查更改为:
var $fileCheck = $.get($section).done(function(response){
self.appWrap.html(response);
}).fail(function(){
self.setError('No se pudo cargar los datos especificados desde ' + $section);
});
答案 0 :(得分:2)
试试这个:
function SectionHandler($appWrap) {
var that = this;
this.appWrap = $appWrap;
this.loading = function() {
that.appWrap.addClass('section-loading').html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
}
this.setError = function($info) {
that.appWrap.addClass('section-error').html($info);
}
this.load = function($section) {
var $fileCheck = $.get($section).success(function(){
that.loading();
that.load($section);
}).fail(function(){
that.setError('No se pudo cargar los datos especificados desde /[ ' + $section + ' ]\ ;');
});
}
}
问题是一旦你进入一个函数,this
的值就会发生变化。您可以通过在主函数that
中声明变量来解决它,并在以后引用它。
- 编辑 -
我想注意,行that.load($section);
将递归调用SectionHandler.load()
,直到AJAX请求失败,或者直到您收到stackoverflow
错误。
是的,我一直希望有什么东西可以引用那个错误:)
答案 1 :(得分:1)
你有正确的想法,但this
的上下文可以在另一个函数的范围内更改(并且它在jQuery回调的上下文中),所以如果你想确保this.loading()
始终是您所指向的,在JavaScript中您希望将this
分配给变量,以便您可以从该特定版本的this
调用该函数。通常称为self
或that
。像这样:
function SectionHandler($appWrap) {
var self = this;
self.appWrap = $appWrap;
self.loading = function() {
self.appWrap.addClass('section-loading')
.html("<i class='fa fa-refresh fa-2x fa-spin'></i>");
}
self.setError = function($info) {
self.appWrap.addClass('section-error').html($info);
}
self.load = function($section) {
var $fileCheck = $.get($section).success(function(){
self.loading();
self.load($section);
}).fail(function(){
self.setError('No se pudo cargar los datos especificados' +
' desde /[ ' + $section + ' ]\ ;');
});
}
}
答案 2 :(得分:1)
您有正确的想法,因为此处代码中的this
不再代表SectionHandler
,而是裁判$.get($section).success(function()
。处理此问题的一种方法是在进入函数之前将this
存储在变量中:
function SectionHandler($appWrap) {
var self = this;
...
this.load = function($section) {
var $fileCheck = $.get($section).success(function(){
self.loading();
...