【问题标题】:Assigning scope amongst jQuery.getJSON and a JS.Class在 jQuery.getJSON 和 JS.Class 之间分配范围
【发布时间】:2010-02-24 12:23:47
【问题描述】:

我正在尝试将一些 JSON 数据分配给 JS.Class 实例的属性。

var MyClass = new JS.Class({
  initialize: function(uuid) {
      this.uuid = uuid;
  },
  write: function() {
    $.getJSON(url+"?callback=?", {}, function(data) {
      Assign(data);
    });
    function Assign(data) { this.content = data; };
  }
});

var m = new MyClass("uuid_goes_here");
m.write();

JSON 是异步接收的,这就是$.getJSON 回调中的函数调用的原因。

我现在遇到的问题是Assign 函数中的this.content 不在名为write 的实例方法的范围内。因此,虽然this.uuid 返回正确,但this.content 仍未定义(如您所料)。

关于如何纠正这个问题的任何想法?我尝试使用全局变量作为解决方法,但异步调用不允许这样做(而且这是一个糟糕的解决方案)。

有几点需要注意,以防万一:我必须使用 JSONP,所以“?callback=?”必须留下来,我想保持异步。

【问题讨论】:

    标签: javascript jquery scope this


    【解决方案1】:

    我通常会选择 czarchaic 的版本,或者用对象中的绑定方法替换 Accept。您必须记住的是,像这样调用Accept()(作为函数调用而不是方法调用)会将this 绑定到全局对象,即window。我会试试这个:

    var MyClass = new JS.Class({
      initialize: function(uuid) {
          this.uuid = uuid;
      },
      write: function() {
        $.getJSON(url+"?callback=?", {}, this.method('setContent'));
      },
      setContent: function(data) {
        this.content = data;
      }
    });
    

    请参阅http://jsclass.jcoglan.com/binding.html 了解更多信息。

    【讨论】:

    • 效果很好,谢谢!有一种感觉与绑定有关,但正确的方法让我无法理解。
    • 作为附录:尽管 jcoglan 的解决方案运行良好,但如果我打算编写一个利用 this.content 的新实例方法,并在 write() 之后直接调用新实例方法,异步性质$.getJSON 也会搞砸。只是想澄清一下。
    • 您是如何处理 ajax 调用的异步特性的,尤其是当您需要从其他函数调用内容时?
    • 我会向您展示一些代码,但我不会格式化我放在这里的代码。在评论线程中与某人共享代码的首选方式是什么?
    • 我认为支持新功能,请在添加评论时查看格式选项...或指向您的一篇博文的链接(抱歉回复晚了...)
    【解决方案2】:

    你应该在 write 方法中缓存当前实例,并在 ajax 之后更新它。

    write: function() {
      var self=this;
     $.getJSON(url+"?callback=?", {}, function(data) {
        self.data=data;
     });
    }
    

    【讨论】:

    • 这与 Pascal MARTIN 的回答本质上不是一样的吗?我已经尝试过了,它可以工作,但只能在 ajax 调用之后立即工作,并且再也不会。我最终想在除 write 之外的其他实例方法中使用 this.content,就像我可以使用 this.uuid 一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2012-04-16
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2021-03-28
    相关资源
    最近更新 更多