Javascript范围问题

时间:2009-10-08 20:20:46

标签: javascript scope dojo

我正在扩展dojo的dojox.data.JsonRestStore,我想提供自己的固定方案。 这是getUsername将无法工作,因为它不引用当前数据存储区 看看这段代码:

/**
 * @author user
 */
dojo.provide("cms.user.UserAuthenticationStore");

dojo.require("dojox.data.JsonRestStore");

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], {
    schema: {
        prototype: {
            getUsername: function(){
                return ???.getValue(this, "username");
            }
        }
    }
});

你能告诉我要替换什么???与?
编辑:
这是有效的代码,但它很难看,有人能告诉我如何解决这个问题吗?

/**
 * @author user
 */
dojo.provide("cms.user.UserAuthenticationStore");

dojo.require("dojox.data.JsonRestStore");

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], {
    schema: {
        prototype: {}
    },
    constructor: function(){
        var that = this;
        this.schema.prototype.getUsername = function(){
            return that.getValue(this, "username");
        }
    }
});

2 个答案:

答案 0 :(得分:1)

而不是:

this.schema.prototype.getUsername = function() {
  return ???.getValue(this, "username");
}

您可以尝试:

this.schema.prototype.getUsername = dojo.hitch(this, "getValue", <this>, "username");

其中“<this>”是用作getValue函数的第一个参数的变量。否则,您的“that”并不太难看,但人们通常将其称为“self”或其他内容。

编辑:

也许这会奏效吗?创建新架构的快速而肮脏的方式。否则,您可能希望创建另一个分别定义自己的方案的组件。然后你可以创建一个“new MySChema()”作为“schema”var。

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], {
    self: this,
    schema:  new (function() {
                this.getUsername = function () { return self.getValue(this, "username"); }
             }
    })();
});

答案 1 :(得分:0)

这是正确的方法:

/**
 * @author user
 */
dojo.provide("cms.user.UserAuthenticationStore");

dojo.require("dojox.data.JsonRestStore");

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], {
    schema: {
        prototype: {
            store: null,
            getUsername: function(){
                return this.store.getValue(this, "username");
            }
        }
    },
    constructor: function(){
        this.schema.prototype.store = this;
    },
    login: function(){

    },
    logout: function(){

    }
});