Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为自定义小部件定义自定义getter和setter道场_Javascript_Dojo - Fatal编程技术网

Javascript 如何为自定义小部件定义自定义getter和setter道场

Javascript 如何为自定义小部件定义自定义getter和setter道场,javascript,dojo,Javascript,Dojo,对于从_WidgetBase继承的自定义小部件,定义自定义getter和setter的模式是什么?我感到困惑的是,在dojo Stateful的文档中(据说是由_WidgetBase继承的),它定义了以下模式 所以一般来说xxxGetter和xxxSetter 其中xxx是财产的确切名称 然而,在_WidgetBase的文档中,示例中显示的模式如下所示 首先,getter/setter中属性的名称与注释中定义的实际属性不完全匹配,第二种模式与有状态文档中的模式完全不同 那么它是哪一个呢?如果您要

对于从_WidgetBase继承的自定义小部件,定义自定义getter和setter的模式是什么?我感到困惑的是,在dojo Stateful的文档中(据说是由_WidgetBase继承的),它定义了以下模式

所以一般来说xxxGetter和xxxSetter 其中xxx是财产的确切名称

然而,在_WidgetBase的文档中,示例中显示的模式如下所示

首先,getter/setter中属性的名称与注释中定义的实际属性不完全匹配,第二种模式与有状态文档中的模式完全不同


那么它是哪一个呢?

如果您要通过继承
\u WidgetBase
来创建dijit/widget。您需要遵循
\u WidgetBase
的文档

如果您正在创建一个继承了
Stateful
模块(它不是dijit)的模块,那么您需要遵循
Stateful
的文档

为了澄清您的疑问,
\u WidgetBase
自定义getter/setter重写了
Stateful
的方法。因此,如果要创建小部件,则需要自定义getter/setter的格式为
\u getXxxxAttr
/
\u setxxattr

更新: 问题不是自定义setter的格式。即使没有自定义getter/setter,setter也会设置该值。它将创建一个新属性并存储该值。如果目标只是将值作为属性存储在对象中,则不需要自定义setter/getter。但作为一种编码标准,这是不好的(这里不讨论这一点)

如果由于更新属性而发生其他更改或事件,则需要使用文档中描述的自定义getter或setter。下面是一个片段,它将向您展示两种格式之间的差异。观察结果,以及更新的方式和属性


JS-Bin
require([“dojo/_base/declare”、“dijit/_WidgetBase”、“dojo/Stateful”]、函数(declare、_WidgetBase、Stateful){
var CustomDijit=declare([\u WidgetBase]{
_自定义名称:“”,
问候:“,
_getNameAttr:函数(){
返回此。\u customname;
},
_setNameAttr:函数(值){
这是。_customname=value;
this.greeting=“Hello”+this.\u customname+“!”;
}
});
var CustomDijit2=declare([\u WidgetBase]{
_自定义名称:“”,
问候:“,
_nameGetter:function(){
返回此。\u customname;
},
_命名空间:函数(值){
这是。_customname=value;
this.greeting=“Hello”+this.\u customname+“!”;
}
});
var obj=new CustomDijit();
对象集(“名称”、“杰夫”);
console.log(obj.get(“name”));
控制台日志(对象名称);
控制台日志(对象名称);
控制台日志(对象问候语);
var obj2=new CustomDijit2();
obj2.set(“名称”、“杰夫”);
console.log(obj2.get(“name”);
console.log(obj2.\u customname);
console.log(obj2.name);
console.log(obj2.greeting);
});

如果要创建dijit/widget,请通过继承
\u WidgetBase
。您需要遵循
\u WidgetBase
的文档

如果您正在创建一个继承了
Stateful
模块(它不是dijit)的模块,那么您需要遵循
Stateful
的文档

为了澄清您的疑问,
\u WidgetBase
自定义getter/setter重写了
Stateful
的方法。因此,如果要创建小部件,则需要自定义getter/setter的格式为
\u getXxxxAttr
/
\u setxxattr

更新: 问题不是自定义setter的格式。即使没有自定义getter/setter,setter也会设置该值。它将创建一个新属性并存储该值。如果目标只是将值作为属性存储在对象中,则不需要自定义setter/getter。但作为一种编码标准,这是不好的(这里不讨论这一点)

如果由于更新属性而发生其他更改或事件,则需要使用文档中描述的自定义getter或setter。下面是一个片段,它将向您展示两种格式之间的差异。观察结果,以及更新的方式和属性


JS-Bin
require([“dojo/_base/declare”、“dijit/_WidgetBase”、“dojo/Stateful”]、函数(declare、_WidgetBase、Stateful){
var CustomDijit=declare([\u WidgetBase]{
_自定义名称:“”,
问候:“,
_getNameAttr:函数(){
返回此。\u customname;
},
_setNameAttr:函数(值){
这是。_customname=value;
this.greeting=“Hello”+this.\u customname+“!”;
}
});
var CustomDijit2=declare([\u WidgetBase]{
_自定义名称:“”,
问候:“,
_nameGetter:function(){
返回此。\u customname;
},
_命名空间:函数(值){
这是。_customname=value;
this.greeting=“Hello”+this.\u customname+“!”;
}
});
var obj=new CustomDijit();
对象集(“名称”、“杰夫”);
console.log(obj.get(“name”));
控制台日志(对象名称);
控制台日志(对象名称);
控制台日志(对象问候语);
var obj2=new CustomDijit2();
obj2.set(“名称”、“杰夫”);
console.log(obj2.get(“name”);
console.log(obj2.\u customname);
console.log(obj2.name);
console.log(obj2.greeting);
});

谢谢,一个有趣的观察结果是,当观察变量的更改时,仅当您使用_setfor widgetBase样式getter、setter(即使用
fooBar: null,
_fooBarGetter: function(){
  return this.fooBar;
},
_fooBarSetter: function(value){
  this.fooBar = value;
},
// for the field "foo" in your widget:

// custom getter
_getFooAttr: function(){ /* do something and return a value */ },

// custom setter
_setFooAttr: function(value){ /* do something to set a value */ }