JavaScript - 相当于PHP类自我::

时间:2015-02-08 04:59:16

标签: javascript php

所以我一直在寻找这个,因为它让我头痛无法实现这一点......而且似乎没有像我预期的那样解决方案。

我们假设我们有一个样本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);
});

3 个答案:

答案 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调用该函数。通常称为selfthat。像这样:

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();
            ...