【问题标题】:Javascript Prototype pub sub method out of scopeJavascript Prototype pub sub 方法超出范围
【发布时间】:2013-03-05 18:37:39
【问题描述】:

在我的构造函数中,我订阅了另一个类函数。如何从订阅中调用类方法 show。

var MemPortfolio = MemPortfolio || {};
MemPortfolio.Portfolio = function (contentid, thumbclass, featuredid) {
    this.thumbClass = thumbclass;
    this.featuredId = "#" + featuredid;
    var that = this;
    //subscribe to menutile click
    $.subscribe("/menutile/click/portfolio", function (tilename) {
        that.Show();
    });
};

MemPortfolio.Portfolio.prototype.Show = function () {
    alert("show");

}

在我准备好的文档中: /// ///

$(document).ready(function () {
    //check exists?
    var tilemenu = new MemTileMenu.Menu("menu", "menuitem", "contentarea");
    var portfolio = new MemPortfolio.Portfolio("contentarea", "thumb", "");
});

我得到了这个工作 -

/// <reference path="jquery-1.7.1.js" />
/// <reference path="jquery.ba-tinypubsub.js" />
var MemPortfolio = MemPortfolio || {};
MemPortfolio.Portfolio = function (contentid, thumbclass, featuredid) {
    this.thumbClass = thumbclass;
    this.featuredId = "#" + featuredid;    
};

MemPortfolio.Portfolio.prototype = {

    show: function () {
        alert("show");
    },
    subscribe: function () {
        var that = this;
        $.subscribe("/menutile/click/portfolio", function (tilename) {
            that.show();
        });
    }

Doc.Ready 在这里:

/// <reference path="tilemenu.js" />
/// <reference path="portfolio.js" />
$(document).ready(function () {
    //check exists?
    var tilemenu = new MemTileMenu.Menu("menu", "menuitem", "contentarea");
    var portfolio = new MemPortfolio.Portfolio("contentarea", "thumb", "");
    portfolio.subscribe();
});
    }

谢谢。 书呆子

【问题讨论】:

  • 如果Portfolio 是使用new 调用的,那么您现在正在执行此操作。
  • 我得到对象不支持属性或方法
  • 所以你是说你确实使用了new?如果是这样,那么您在 MemPortfolio.Portfolio.prototype.Show = function () { 代码有机会运行之前调用它。
  • 看起来对吗?有什么问题?
  • 你真的需要为我们把它们放在一起。无法知道代码运行的顺序。给定正确的执行顺序,您的代码可以正常工作:jsfiddle.net/LVnqw

标签: javascript prototype publish-subscribe


【解决方案1】:

尝试将MemPortfolio.Portfolio.prototype 替换为MemPortfolio.prototype.Portfolio

【讨论】:

    【解决方案2】:

    这行得通。

      /// <reference path="jquery-1.7.1.js" />
        /// <reference path="jquery.ba-tinypubsub.js" />
        var MemPortfolio = MemPortfolio || {};
        MemPortfolio.Portfolio = function (contentid, thumbclass, featuredid) {
            this.thumbClass = thumbclass;
            this.featuredId = "#" + featuredid;    
        };
    
        MemPortfolio.Portfolio.prototype = {
    
            show: function () {
                alert("show");
            },
            subscribe: function () {
                var that = this;
                $.subscribe("/menutile/click/portfolio", function (tilename) {
                    that.show();
                });
            }
        Doc.Ready here:
    
        /// <reference path="tilemenu.js" />
        /// <reference path="portfolio.js" />
        $(document).ready(function () {
            //check exists?
            var tilemenu = new MemTileMenu.Menu("menu", "menuitem", "contentarea");
            var portfolio = new MemPortfolio.Portfolio("contentarea", "thumb", "");
            portfolio.subscribe();
        });
            }
    

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 2012-12-19
      • 1970-01-01
      • 2020-04-03
      • 2021-10-21
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多