首页 文章 精选 留言 我的

精选列表

搜索[学习循环],共10000篇文章
优秀的个人博客,低调大师

学习JQuery

1. 重要基础 简写加载函数,事情必须在DOM加载之后,否则无法绑定对象 $(document).ready() $(function(){}); //推荐缩写 使用包括 JQuery 库外语法类似的 JavaScript 库时,注意命名冲突 Jquery.noConflict() var $$ = JQuery; //换成 $$ 调用Jquery函数 2. 基础选择器 (选择器使用css1,css2的全部选择器语法,以及部分css3语法。) 对 id 元素使用选择器: 默认对第一个元素外的其他元素"失明",返回第一个对象。 调用属性 .length 或函数 .size() 查看对象集合的数量 获取对象集合里的元素 .get(0) 或加下标 [0] 群组选择器: 逗号列举 $("label, #text, .blue") 后代选择器 $("#nav h4 span") $("#nav").find("h4").find("span") 子代选择器(只能是直接的父子关系) $("#nav > span") $("#nav").children("span") 获取 span 的下一个同级兄弟元素 p $("div span + p") $("div span").next() 获取 span 以下的所有同级兄弟元素 p $("div span ~ p") $("div span").nextAll("p") 同级向上(向下)选取元素,直到找到 label 元素为止(不包括 label 元素) .prevUntil("label") //向上 .nextUntil("label") //向下 寻找同级兄弟 .siblings("input") .prevAll() 加上 .nextAll() 3. 过滤选择器 第一个(最后一个)元素 :first :last 排除满足条件的元素 .not(.blue) 奇(偶)序元素 :odd :even 等于/大于/小于 :eq(2) :gt(3) :lt(5) 标题元素(h1 ~ h6) :header 正在执行动画的元素 :animated 正被聚焦的元素 :focus 包含指定文本的元素 :contains(".com") 不包含文本或者无子元素的元素 :empty 包含文本或子元素的元素 :parent 具有指定类的元素 :has(".blue") 不可见(可见)的元素 :hidden :visible 每个父元素的第一个(最后一个)子元素 :first-child :last-child 只有一个子元素的元素 :only-child 每个指定子元素的元素 :nth-child(odd) 匹配的元素 .is(".bule") .hasClass("blue") .filter(".blue") .slice(1, 4) //第二个到第四个元素 4. 表单选择器 选择指定元素 :input :button 选择不同类型的input元素 :text :password :radio :checkbox :submit :reset :image :button :file :hidden 选择不同属性的元素 :enabled :disabled :checked :selected 5. 基本 DOM 操作 获取(设置)元素html内容 .html() //加参数则设置 获取(设置)元素文本内容 .text() //加参数则设置 获取(设置)表单元素内容 .val() //加参数则设置 获取(设置)元素属性值 .attr() //加参数则设置 .attr({A: a, B: b}) //设置多个参数 获取(设置)css样式 .css() //加参数则设置,多参数设置同上 添加css样式 .addClass("blue") .addClass("blue red green") 移除css样式 .removeClass("blue") //移除多个类同上 切换css样式 .toggleClass("blue") //切换多个类同上 .toggleClass(function(){}, [rate]) //自定义切换规则,第二个为可选参数频率 获取(设置)高度(宽度) .height() //加参数则设置 .width() //加参数则设置 .height(function(object, value){}) //object指定元素、value指定元素的高度 获取内外边框高度宽度 .innerWidth() .innerHeight() .outerWidth() //包括边框和内边距 .outerHeight() //同上 .outerWidth(true) //同上并包括外边框 .outerHeight(true) //同上 相对偏移 .offset() //相对于视口 .position() //相对于父元素 滚动条相关(获取/设置) .scrollTop() //垂直 .scrollLeft() //水平 6. DOM节点操作 元素内部前面插入节点 .prepend(html) //插入节点html .prepend(function(new, parent)) //向parent元素内部前面插入节点new .prependTo(target) //将元素移至指定元素target 元素内部后面插入节点 .append(html) .append(function(new, parent){}) .appendTo(target) 元素外部前面插入节点 .before() .before(function(new, parent){}) .insertBefore(target) 元素外部后面插入节点 .after() .after(function(new, parent){}) .insertAfter(target) 包裹节点 .wrap(target) //参数可为html内容或者对象节点 .wrap(function(target){}) .unwrap() //解除一层包裹 批量包裹 .wrapAll(parent) //被元素parent包裹 .wrapInner(parent) //包裹元素parent的子元素 复制节点 .clone(true) //加上true表示同时复制绑定事件、不加则只复制元素和内容 删除节点 .remove(‘p’) //可选参数 保留事件行为的删除 .detach() 删除节点内容 .empty() 替换节点 .replaceWith('span') .replaceAll('p') 7. 基本事件 (以下函数均含匿名函数) 点击、双击 .click() .dbclick() 点击弹起瞬间、弹起后 .mouseup() .mousedown() 鼠标穿出入触发(包括子元素) .mouseenter() .mouseleave() 鼠标穿出入触发(不包括子元素) .mouseover() .mouseout() 鼠标移动 .mousemove() 键盘按下弹起瞬间、弹起后 .keyup() .keydown() .keypress() 焦点激活与丢失 .focus() .blur() .focusin() .focusout() 其他事件 .select() //文本选定 .change() //值被改变 .submit //表单提交 .scroll() //滚动条拖动 .unload() //卸载本页面 .hover(fun1, [fun2]) //鼠标移入(移出) 8. 事件对象 (function(event){}) 页面坐标(属性) pageX //相对于页面 pageY screenX //相对于显示屏 screenY clientX //相对于视口 clientY 9. 高级事件 模拟用户行为 .trigger("click", [param1, param2]) .trigger("click", [{paramA1 : a, paramA2 : b}, {paramB1, paramB2}]) 绑定(解绑)事件 .on("click dbclick", [function(){}]) .off("click") 仅触发一次事件 .one() //用法同.on 10. 动画 显示/隐藏 .show() //可选参数持续时间,如3000表示3秒,或者“slow” .hide() //添加第二参数闭包函数则动画完毕后执行 自定义动画 .animate({'top': '+=88px', 'height': '200px'}, 'slow') 队列动画 .queue([function([next]){ ......; [next()[]}]) .dequeue() //两个函数都是执行下一个函数 上下卷动 .slideUp() .slideDown() .slidToggle() 动画操作 .delay() .stop() 动画属性 .fx.interval //运行帧数 .fx.off = ture //关闭动画效果 11. AJAX .load() 第一个参数:目的 url 或者带选择器的 url (可带get的参数) 第二个参数:不为空则为post方式 第三个参数:闭包函数(返回数据,状态,XMLHttpRequest对象) .get() .post() .AJAX() //底层函数 (以下为传入参数的属性) url type timeout data dataType beforeSend complete success error global cache content contentType async processData dataFilter ifModified jsonp username password scriptCharset xhr traditional $.ajaxStart() $.ajaxStop() $.ajaxError() $.ajaxSuccess() $.ajaxComplete() $.ajaxSend() $.ajaxSetup() //请求默认值来初始化参数 $('form').serialize() //获取表单所有值 $('form').serializeArray() //返回键值对的Json对象 12. 工具函數 除去字符串两边空格 $.trim(str) 遍历数组(对象) $.each(arr, function(index, value){}) 数据筛选 $.grep(arr, function(element, index){}) 修改数据 $.map(arr, function(element, index){}) 合并数组 $.merge(arr1, arr2) 6.测试类型函数 $.isArray(obj) $.isFunction(obj) $.isEmptyObject(obj) $.isPlainObject(obj) //纯粹对象 $.isNumeric(data) $.isWindow(data) //window对象 $.contains(obj) //包含其他节点 判断类型函数 $.type(data) 将对象键值对转换为URL字符串键值对 $.param(obj) 调用内部函数 $.proxy(obj, 'objFunc') //返回obj对象里的objFunc函数 13. 插件 1.Validate.js (jquery.validata.js 、 jquery.validate.messages_zh.js) 相关代码 $('form').validate() 必填项 class = “required” 邮箱 class = "email" 不得少于两位 minlength = "2" 网址 class = "url" 2. 自动完成插件 (jquery.autocomplete.js 、 jquery-migrate-1.2.1.js) var name = ['John', 'Jack', 'Tom', 'Kitty']; $('form input[name=name]').autocomplete(name, {minChars: 0}) //0表示不需要输入一个字符即可显示所有备选数据 3. 自定义插件 分类 封装对象方法的插件 封装全局函数的插件 选择器插件 插件规范 名字: jquery.[name].js 局部对象附加 jquery.fn 对象上,全局函数附加在 jquery 上 插件内部,this 指向的是当前的局部对象 可以通过 this.each 来遍历所有元素 所有的方法或插件,必须用分号结尾,避免出现问题 插件应该返回的是 JQuery 对象,以保证可链式连缀 避免插件内部使用 $ ,如果要使用,请传递 JQuery 进去

优秀的个人博客,低调大师

Laravel学习

Laravel是个很强大的PHP框架,它剔除了开发中Web开发中比较痛苦的过程,提供了验证(authentication),路由(routing),Session和缓存(caching)等开发过程中常用到的工具或者功能。 Laravel的配置都存放在app/config中。 里面所有的*.php都按照return的形式返回数据,那么就可以使用Config::get("key")来获取配置。使用Config::set("key", "value") 来赋值配置项 要想使用不同的环境配置,就需要在config下创建对应配置的文件夹。然后它会覆盖对应的配置项。 获取当前的环境是使用App::environment(),判断当前环境是什么是使用:App::environment("local") providers是用来配置对应的服务的,比如: Laravel的请求周期: 1 请求先从public/index.php中进入 2 bootstrap/start.php文件创建app并检测环境 3 内部的 /Illuminate/Foundation/start.php文件配置相关设置并加载服务器 4 加载app/start目录下的文件 5 加载app/routes.php的路由设置 6 request通过controller等转化为response 7 返回response 路由配置: 配置的格式是: Route::get('foo/bar', funciton(){return 'Hello World';}) 路由参数是可以有下面几种的: 可选路由参数: 带有默认的可选的路由参数: 用正则表达式限定的路由参数: 传递参数限定的数组: 定义全局模式: 不同的参数定位到不同的路由: 好,现在有个问题是某些路由必须要登录或者验证才能访问怎么办?这里就使用到了路由过滤器这个东西。 比如下面这个例子,当年龄小于200的时候就跳转到主页: Request中的操作: 获取用户提交的值:Input::get('name'); 获取用户提交的值并指定默认值:Input::get('name', 'Sally'); 用户提交的信息是否存在:Input::has('name') 获取所有用户提交的信息:Input::all() 获取其中几项指定的信息:Input::only('username', 'password'); 获取除几项之外的提交信息:Input::except('card'); 访问用户提交的数组:Input::get('products.0.name'); cookie操作: 获取Cookie中的值:Cookie::get('name') 添加一个Cookie: $response = Response::make('Hello World'); response−>withCookie(Cookie::make(′name′,′value′,response−>withCookie(Cookie::make(′name′,′value′,minutes)); 如果想在Response之前设置Cookie,使用Cookie::queue() Cookie::queue(name,name,value, $minute); Session操作: 存储一个变量:Session::put('key', 'value'); 读取一个变量:Session::get('key'); 读取一个变量或者返回默认值:Session::get('key', 'default'); 检查一个变量是否存在:Sesssion::has('key'); 删除一个变量:Session::forget('key'); 删除所有Session变量:Session::flush(); 文件上传操作: 获取用户上传文件:$file = Input::file('photo'); 判断是否有上传这个文件:Input::hasFile('photo'); 移动上传的文件: Input::file('photo')->move($destinationPath); Input::file('photo')->move(destinationPath,destinationPath,fileName); 获取上传文件大小: Input::file('photo')->getSize(); 获取上传文件类型: Input::file('photo')->getMimeType(); 获取用户请求路径:Request::path(); 获取用户请求URL:Request::url(); 获取Header中的信息:Request::header('Content-Type'); 获取SERVER中的信息:Request::server('PATH_INFO'); 重定向: 重定向: return Redirect::to('user/login'); 有参数的重定向: return Redirect::to('user/login')->with('message', 'Login Failed'); 重定向到路由:return Redirect::route('profile', array('user' => 1)); 返回重定向到Action:return Redirect::action('UserController@profile', array('user' => 1)); 视图层: 传递数据给视图:$view = View::make('greeting')->with('name', 'Steve'); 将一个视图传递给另一个视图:$view = View::make('greeting')->nest('child', 'child.view'); 返回json:return Response::json(array('name' => 'Steve', 'state' => 'CA')); 返回jsonp:return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback')); 返回下载文件: return Response::download($pathToFile); return Response::download(pathToFile,pathToFile,status, $headers); 一个基本的控制器: 路由就长这样: 默认中,app/start/global.php文件中包含了一个处理所有异常的处理器。 监听fatal error,可以使用App::fatal方法。 日志操作: Log::info Log::warning Log::error 本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3830750.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

mmap学习

内存页: Linux是以页为单位来管理物理内存的,一页大小一般等于4096字节。页容量越大,系统中可能存在的内存碎片就越多。 mmap将一个磁盘上的文件或者对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。 当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用。 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。比如像管道和消息队列,需要在内核和用户空间进行四次的数据拷贝。 mmap的系统操作有两个: 1 2 3 4 5 # include <sys/mman.h> void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *start, size_t length); 第一个函数mmap,将文件描述符fd中的内容放到内存start --- ( start+ length) 的空间中。 port: 期望的内存保护方式,比如内存可读/可写/可执行,但是不能与文件的打开模式冲突。就是只能是文件权限的子集。 flag: 指定映射对象的类型 fd: 被映射的文件描述符。 第二个函数munmap,解除一个映射关系。 这两个函数的说明文档在: http://man7.org/linux/man-pages/man2/mmap.2.html 例子 比如这个例子是php的apc使用了mmap: 1 2 3 4 5 6 7 8 9 10 11 #strace -p `cat / var /run/httpd.pid` open( "/var/www/html/apc_load.php" , O_RDONLY) = 13 ... mmap2(NULL, 31457280, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 1232, 0) = 0xb5ce7000 ... nanosleep({3600, 0}, mmap2() 系统调用执行的操作几乎与mmap(2) 一样,唯一的区别在于最后一个参数给出的在文件中的偏移是以4096-字节为单位。 这个mmap就在内存中空出30M的空间做内存映射 php的apc缓存加速 php的apc大致原理是将php的opcode(php的操作码)使用mmap映射(就是复制)到共享内存中,然后下次用户再访问调用php访问,就可以直接去共享内存中读取,而不需要再到磁盘上读取了。 当然当php文件更新的时候,opcode也会自动失效(有检测机制)。 本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3171056.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker学习

1. 查看docker信息(version、info) #查看docker版本$dockerversion#显示docker系统的信息$dockerinfo 2. 对image的操作(search、pull、images、rmi、history) #检索image$dockersearchimage_name#下载image$dockerpullimage_name#列出镜像列表;-a,--all=falseShowallimages;--no-trunc=falseDon'ttruncateoutput;-q,--quiet=falseOnlyshownumericIDs$dockerimages#删除一个或者多个镜像;-f,--force=falseForce;--no-prune=falseDonotdeleteuntaggedparents$dockerrmiimage_name#显示一个镜像的历史;--no-trunc=falseDon'ttruncateoutput;-q,--quiet=falseOnlyshownumericIDs$dockerhistoryimage_name 3.启动容器(run) docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。 #在容器中运行"echo"命令,输出"helloword"$dockerrunimage_nameecho"helloword"#交互式进入容器中$dockerrun-i-timage_name/bin/bash#在容器中安装新的程序$dockerrunimage_nameapt-getinstall-yapp_name Note: 在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。 4. 查看容器(ps) #列出当前所有正在运行的container$dockerps#列出所有的container$dockerps-a#列出最近一次启动的container$dockerps-l 5. 保存对容器的修改(commit) 当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。 #保存对容器的修改;-a,--author=""Author;-m,--message=""Commitmessage$dockercommitIDnew_image_name Note:image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。 6. 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach) #删除所有容器$dockerrm`dockerps-a-q`#删除单个容器;-f,--force=false;-l,--link=falseRemovethespecifiedlinkandnottheunderlyingcontainer;-v,--volumes=falseRemovethevolumesassociatedtothecontainer$dockerrmName/ID#停止、启动、杀死一个容器$dockerstopName/ID$dockerstartName/ID$dockerkillName/ID#从一个容器中取日志;-f,--follow=falseFollowlogoutput;-t,--timestamps=falseShowtimestamps$dockerlogsName/ID#列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A增加的,D删除的,C被改变的$dockerdiffName/ID#显示一个运行的容器里面的进程信息$dockertopName/ID#从容器里面拷贝文件/目录到本地一个路径$dockercpName:/container_pathto_path$dockercpID:/container_pathto_path#重启一个正在运行的容器;-t,--time=10Numberofsecondstotrytostopforbeforekillingthecontainer,Default=10$dockerrestartName/ID#附加到一个运行的容器上面;--no-stdin=falseDonotattachstdin;--sig-proxy=trueProxifyallreceivedsignaltotheprocess$dockerattachID Note:attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。 7. 保存和加载镜像(save、load) 当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。 #保存镜像到一个tar包;-o,--output=""Writetoanfile$dockersaveimage_name-ofile_path#加载一个tar包格式的镜像;-i,--input=""Readfromatararchivefile$dockerload-ifile_path#机器a$dockersaveimage_name>/home/save.tar#使用scp将save.tar拷到机器b上,然后:$dockerload</home/save.tar 8、 登录registry server(login) #登陆registryserver;-e,--email=""Email;-p,--password=""Password;-u,--username=""Username$dockerlogin 9. 发布image(push) #发布docker镜像$dockerpushnew_image_name 10.根据Dockerfile 构建出一个容器 #build --no-cache=falseDonotusecachewhenbuildingtheimage -q,--quiet=falseSuppresstheverboseoutputgeneratedbythecontainers --rm=trueRemoveintermediatecontainersafterasuccessfulbuild -t,--tag=""Repositoryname(andoptionallyatag)tobeappliedtotheresultingimageincaseofsuccess$dockerbuild-timage_nameDockerfile_path 本文转自yzy121403725 51CTO博客,原文链接:http://blog.51cto.com/lookingdream/1836230,如需转载请自行联系原作者

优秀的个人博客,低调大师

ansible学习

一、ansible安装 #只需要管理端安装 yum install epel-release yum install ansible 二、配置 vim /etc//ansible/hosts#添加远程被管理端主机 192.168.10.148 k8s-master k8s-node-2 三、 生成公钥放到被管理端 ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.148 ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-master ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node-2 管理端测试:ansible all -m ping ansible all -m ping -u alex#以alex用户执行 ansible all -m ping -u alex --sudo --sudo-user batman#sudo方式运行 四、命令 #开启两个进程并行执行,关闭atlanta组的所有主机 ansible atlanta -a "/sbin/reboot" -f 2 #拷贝文件到atlanta组的主机 ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts" #修改为文件权限 ansible atlanta -m file -a "/tmp/hosts mode=777" #创建目录 ansible atlanta -m file -a "dest=/tmp/c mode=755 owner=nginx group=nginx state=directory" #删除目录 ansible atlanta -m file -a "dest=/tmp/c state=absent" #确认软件包是否安装,但不去升级 ansible atlanta -m yum -a "name=nginx state=present" #确认一个软件包没有安装 ansible atlanta -m yum -a "name=nginx state=absent" #使用 ‘user’ 模块可以方便的创建账户,删除账户,或是管理现有的账户: ansible all -m user -a "name=foo password=<crypted password here>" ansible all -m user -a "name=foo state=absent" #启动服务 ansible atlanta -m service -a "name=docker state=started" #重启服务 ansible atlanta -m service -a "name=docker state=restarted" #停止服务 ansible atlanta -m service -a "name=docker state=stopped" #需要长时间运行的命令可以放到后台去,在命令开始运行后我们也可以检查运行的状态.如果运行命令后,不想获取返回的信息, 可执行如下命令: ansible all -B 3600 -P 0 -a "/usr/bin/long_running_operation --do-stuff" #如果你确定要在命令运行后检查运行的状态,可以使用 async_status 模块.前面执行后台命令后会返回一个 job id, 将这个 id 传给 async_status 模块: ansible web1.example.com -m async_status -a "jid=488359678239.2844" #获取状态的命令如下: ansible all -B 1800 -P 60 -a "/usr/bin/long_running_operation --do-stuff" 其中-B1800表示最多运行30分钟,-P60表示每隔60秒获取一次状态信息. 五、http安装配置文件修改例子 vim /etc/ansible/hosts #添加主机组 [testhost] 192.168.10.148 192.168.10.224 编写yaml文件 vim http.yml#修改httpd.conf文件时,notify会通知客户端重启httpd - hosts: testhost vars: src_http_dir: "/etc/httpd" dest_http_dir: "/tmp" remote_user: root tasks: - name: instal httpd service yum: name=httpd state=present - name: copy httpd conf copy: src="`src_http_dir`/conf/httpd.conf" dest=/etc/httpd/conf/httpd.conf notify: - restart httpd service - name: start httpd service service: name=httpd state=started enabled=true handlers: - name: restart httpd service service: name=httpd state=restarted 变量使用 vim test1.yml - hosts: testhost vars: src_http_dir: "/etc/httpd" dest_http_dir: "/tmp" remote_user: root tasks: - name: copy httpd conf copy: src="`src_http_dir`/conf/httpd.conf" dest="`dest_http_dir`/http.conf.ansible" 模板使用 vim httpd.conf #修改以下内容 Listen `ansible_all_ipv4_addresses`.`0`:`http_port` ServerName `ansible_nodename` vim test2.yml - hosts: testhost vars: http_port: 8010 http_dir: /etc/httpd/conf remote_user: root tasks: - name: copy httpd conf template: src=/etc/ansible/httpd.conf dest="`http_dir`/httpd.conf" notify: - restart httpd service handlers: - name: restart httpd service service: name=httpd state=restarted 本文转自小白的希望 51CTO博客,原文链接:,http://blog.51cto.com/haoyonghui/1970029如需转载请自行联系原作者

优秀的个人博客,低调大师

databinding学习

构建环境 android{ dataBinding{ enabled = true } } 数据绑定布局文件 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}"/> </LinearLayout> </layout> 上面data标签里声明数据变量,数据类型可以是POJO类,也可以是JavaBeans类 绑定数据 默认情况下,将根据布局文件的名称生成一个Binding类,所以可以利用这个bingding类做绑定操作 例: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User("Test", "User"); binding.setUser(user); } 也可以通过以下几种方式获取binding实例 MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater()); ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false); 事件处理 两种方式 方法引用:先在要绑定的数据类里声明事件要触发的方法,然后布局里直接调用声明的方法,比如: public class MyHandlers { public void onClickFriend(View view) { ... } } <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handlers" type="com.example.Handlers"/> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}" android:onClick="@{handlers::onClickFriend}"/> </LinearLayout> </layout> 不过这种需要View控件已有onClick方法,而且也要注意方法的View参数对应上 监听器绑定 在方法引用中,方法的参数必须与事件侦听器的参数相匹配。在侦听器绑定中,只有您的返回值必须与侦听器的预期返回值相匹配(除非它是期望的void) public class Presenter { public void onSaveClick(Task task){} } <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="task" type="com.android.example.Task" /> <variable name="presenter" type="com.android.example.Presenter" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{() -> presenter.onSaveClick(task)}" /> </LinearLayout> </layout> 可以注意到xml的onClick后面使用的lambda表达式,所以也可以写成: android:onClick="@{(view) -> presenter.onSaveClick(task)}" 布局详情 imports 可直接导入类 例: <data> <import type="android.view.View"/> </data> 为什么?因为下面的控件标签要用 例: <TextView android:text="@{user.lastName}" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/> 如果导入多个类,但类名相同,可以加个alias=""用于区分 也可以在声明variable时type类型名全部加上 自定义binding类名字 在data标签里 加class可改 <data class="ContactItem"> ... </data> <data class=".ContactItem"> ... </data> <data class="com.example.ContactItem"> ... </data> 包含 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/name" bind:user="@{user}"/> <include layout="@layout/contact" bind:user="@{user}"/> </LinearLayout> </layout> 表达式 数字的+ - /* % 字符串 + 逻辑 && || 二进制 & | ^ 一元 + - ! ~ 转移 >> >>> << 比较 == > < >= <= instanceof Grouping() 子面 cast 方法调用 域访问 数组访问 三元: ?: 例 android:text="@{String.valueOf(index + 1)}" android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}" android:transitionName='@{"image_" + id}' 空合并运算符(??)选择左操作数,如果它不为空,或者如果为空则选择右操作数。 android:text="@{user.displayName ?? user.lastName}" = android:text="@{user.displayName != null ? user.displayName : user.lastName}" 数据绑定

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册