1.nestable lists 如何禁止拖动
2.BeanWrapper
nestable lists 如何禁止拖动
我改了下源码,源码加了个allowDrag的属性$("#showModuleInfo").nestable({ allowDrag:false}) //禁止拖拽
加了个refresh的方法,主要用在自己append节点的时候,前面的+-button能刷出来
$("#moduleInfo").nestable("refresh");//
这里传不了附件,把改动截图贴上来了,自己对着jquery.nestable.js改一下吧,框起来的是我动过的,没框的都是原来的
var defaults = {
listNodeName: 'ol',
itemNodeName: 'li',
rootClass: 'dd',
listClass: 'dd-list',
itemClass: 'dd-item',
dragClass: 'dd-dragel',
handleClass: 'dd-handle',
collapsedClass: 'dd-collapsed',
placeClass: 'dd-placeholder',
noDragClass: 'dd-nodrag',
emptyClass: 'dd-empty',
expandBtnHTML: '<button data-action="expand" type="button">Expand</button>',
collapseBtnHTML: '<button data-action="collapse" type="button">Collapse</button>',
group: 0,
maxDepth: 5,
threshold: ,
allowDrag:true
};
---------------------------------------
if(this.options.allowDrag){
list.el.on('mousedown', onStartEvent);
list.w.on('mousemove', onMoveEvent);
list.w.on('mouseup', onEndEvent);
}
--------------------------------------
refresh:function(){
var list=this;
list.el.find(list.options.itemNodeName).each(function() {
$(this).children('[data-action]').remove();
if($(this).find(list.options.listNodeName).children().length>0){
list.setParent($(this));
}else{
list.unsetParent($(this));
}
});
},
BeanWrapper
BeanWrapper 是 Spring 中一个关键的接口,在之前的源码 Spring 单例获取流程中我们已经见过它的身影。
PropertyDescriptor 我们在 Java 内省部分有详细介绍。源码
接下来,源码我们将逐一介绍它所继承的源码接口。
PropertyEditorRegistry 是源码韦根26源码其中之一,要介绍这个接口,源码我们首先要了解 PropertyEditor。源码
PropertyEditor,源码俗称属性编辑器,源码最初只是源码在 GUI 中将字符串转换为 Java 对象相应类型的工具,例如将字符串转换为数值或布尔类型。源码Spring 在 JDK 原有的源码基础上也扩展了不少属性编辑器。
该接口非线程安全。源码
PropertyEditorSupport 是源码 PropertyEditor 的子类,由 JDK 提供。它方便我们继承该基础类,可以方便地扩展属性编辑器。
可以看到,爱他美的溯源码6瓶都一样一些常见的属性编辑器都是继承自它。
再回到我们的属性编辑器注册器,这是 Spring 提供的。
主要功能是注册对应类型的属性编辑器,比如将 Charset 和 CharsetEditor 注册在这里。
该类是继承自 PropertyEditorRegistry 并在里面帮我们注册了一些常用的类型以及对应的属性编辑器。
接下来,我们来看看 PropertyEditorRegistrar。
This 通达信资金博弈源码四条线is the central interface that a { @link PropertyEditorRegistrar} operates on.
它是专门操作 PropertyEditorRegistry 的。
作为 PropertyEditorRegistrar 的唯一子类,它会在你注册属性编辑器注册器的时候为你注册上一些常用的资源相关的属性编辑器。
这个类在 ApplicationContext 的 refresh 的 prepareBeanFactory 中被创建并赋值到 BeanFactory 中。
而 org.springframework.beans.PropertyEditorRegistrar#registerCustomEditors 方法在每次创建 bean 的时候都会被调起。
Spring 提供多类型转换器,子类实现该接口的同时一般也会实现 PropertyEditorRegistry 接口,当然这不是必须的。
因为类型转换器的实现是基于 PropertyEditor 的,而 PropertyEditor 是微信支付宝服务商进件源码线程不安全的,所以 TypeConverter 也是线程不安全的。
这个基于 JDK PropertyEditor 的体系的命名方式都是 xxxSupport,这个抽象类不仅实现了 TypeConverter,还继承自 PropertyEditorRegistrySupport。
这个类主要是作为 BeanWrapperImpl 的基类。
该抽象类中存在一个成员变量 TypeConverterDelegate typeConverterDelegate,真正的转换工作是在它里面进行操作的。这个后续再看它里面的实现。
SimpleTypeConverter 是一分钟选股法公式源码简单实现 TypeConverter 接口的类,跟 BeanWrapperImpl 的逻辑是一样的。同样它也是非线程安全的。
我们在获取 bean 的时候,如果有传入类型,并且在 bean 的类型和入参的不一致的时候,那么就会尝试进行转换。
PropertyAccessor 是一个观其名知其意的接口。
ConfigurablePropertyAccessor 继承自 PropertyAccessor 和 PropertyEditorRegistry,并实现了 TypeConverter 接口。
AbstractPropertyAccessor 实现了所有转换的方法,真正的属性访问的方法留给子类实现。
AbstractNestablePropertyAccessor 提供将对应的集合/数组的值给到目标对象的集合/数组的字段中的功能。
最终 BeanWrapperImpl 继承自 AbstractNestablePropertyAccessor,所以它具有访问属性以及进行相应类型的能力。
虽然我们在程序中很少直接使用 BeanWrapper,一般都是使用 BeanUtils 或者 BeanCopier。
再回到我们上面的 TypeConverterSupport 提及到的 TypeConverterDelegate。
从上面的代码中我们可以知道,Spring 在实现类型转换时,有两套机制,第一套机制依赖于 PropertyEditor,第二套机制依赖于 ConversionService。
关于属性编辑器 PropertyEditor 我们之前已经介绍过了,主要进行的是 String 到 Object 的转换。
正因为如此,属性编辑器进行类型转换有很大的局限性,所以 Spring 又推出了一套 ConversionService 的体系。
Spring 提供的从 S 类型转换到 T 类型的转换器是 ConversionServiceConverter。
为了方便能够将 S 转为一系列的 T 类型,Spring 提供了 ConverterFactory。
转换器的注册器是 ConverterRegistry。
相当于 Registrar 的功能,ConversionService 是线程安全的。
其实可以从 Converter 的定义可以看出,Converter 是无状态的,而不像 PropertyEditor。
在 SpringApplication 的 run 方法的 prepareEnvironment 的 configureEnvironment 中创建了 ApplicationConversionService 并添加了各种常见的转换器。
最后,其实这篇文章只是单纯地了解关于 PropertyEditor 和 ConversionServer 的知识,并没有从源码详细说明 Spring 怎么使用它们。
这个可能放到以后的文章。这篇文章单纯是补全这个主题的基础知识,为后面继续看 Spring 的代码进行铺垫。