安装软件时依赖冲突的万能解决方案

Perface

如果让你实现这个页面和一些操作的,比如点击1、2、3等就在那个input text中显示,还有删除功能,拨打我们先不要管它,只是模拟而已。要是我刚开始做的话,我会这样做:

  1. 用css、HTML布局那个界面
  2. 用javascript的事件委托监听那个按钮的父节点的点击事件

但是如果我想用面向对象的思想做呢?我是用Ext做的,所以我想说的是它帮我封装了很多。可能一些没用过Ext的人不太了解我下面贴的代码,但是我会尽量解释清楚的!

Description

ContactTelPanel =Ext.extend(Ext.Panel, {
	//构造方法
	constructor : function(config) {
		Ext.apply(this, config);//直接把config对象的属性全复制到this对象中
		Parent = this.parent;
		var me = this;
		ContactTelPanel.superclass.constructor.call(this, {//用ContactTelPanel的父类也就是Ext.Panel的构造函数
			autoScroll : true,
			title : "拨打电话",//设置title,跟这篇文章的主体没关系,不要管他
			id : "contacttelpanel",
			bodyStyle : "padding: 30px 300px;",
			defaults : {//可以为该对象(ContactTelPanel)包含的组件(也就是在items配置选项)设置一些相同属性
				layout : "column",
				defaults : {
					xtype : "button",
					width : 50,
					height : 25,
					style : "margin:4px 15px",
					handler : this.press //为每个按钮都添加一个click的事件
				},
				bodyBorder : false
			},
			items : [ {//textfield组件
				height : 30,
				width : 250,
				xtype : "textfield",
				id : "tf",
				style : "margin-bottom:10px"
			}, {// 没有xtype就是默认为panel,下面也是,不然就不要纠结了,直接在这里想象成第一行按钮1、按钮2、按钮3
				items : [ {
					text : "1"
				}, {
					text : "2"
				}, {
					text : "3"
				} ]
			}, {// 这里是按钮4、按钮5、按钮6

				items : [ {
					text : "4"
				}, {
					text : "5"
				}, {
					text : "6"
				} ]
			}, {// 这里是按钮7、按钮8、按钮9 下同
				items : [ {
					text : "7"
				}, {
					text : "8"
				}, {
					text : "9"
				} ]
			}, {
				items : [ {
					text : "*"
				}, {
					text : "0"
				}, {
					text : "#"
				} ]
			}, {
				items : [ {
					text : "拨打",
				}, {
					text : "删除",
				} ]
			} ]
		});
	},
	press : function() {
		var text = this.text, textfield = Ext.getDom("tf");
		if (/[0-9*#]/.test(text)) {//在textfield中显示所点击按钮的数字
			textfield.value += text;
		} else if (this.text == "删除") {//删除功能
			textfield.value = textfield.value.slice(0, -1);
		} else if (this.text == "拨打") {//这个先不要管他
			Tel.telcall(textfield.value);
		}
	}

});

注:其实从上面可以知道ContactTelPanel是继承Ext.Panel,然后这个面板中有很多个键,每个键都监听click事件。确实在这里觉得自己敲得不是很好,应该是用事件委托来实现,因为你每个按钮都监听了click事件,太影响效率了。用事件委托我们可以指监听它的父节点的click事件就行了,然后根据事件流来判断目的对象并操作。本文重点还是监听事件里面handler : this.press这段代码中
。我遇见的问题就是如果我在press函数要用到这个类ContactTelPanel的一些属性,怎么办?

Idea

我在想,我要在press函数中用到这个类的属性,我直接在press用this对象来获取不就行了,但是我错了,比如你在press函数中console.dir(this),看chrome控制台出现的是什么?不幸的是它出现的是Button对象,它的this指针改了。确实有点麻烦,然后我就想了三个方法,如下:

Solution

1 在每个监听事件的函数中传参
代码:handler : this.press(this),然后在press函数体中写alert(arguments[0])
出现的情况:确实在这个页面加载的时候就弹出窗口是ContactTelPanel,但是你点击那些按钮的时候它没出现了
原因:this.press(this),这样子写javascript解析器会当作调用press函数,然后在你加载页面就执行了
2 在这个ContactTelPanel类中设置全局变量
代码:比如在第五行设置me = this,然后在press函数体中写alert(me)
出现的情况:确实可以在点击按钮的时候弹出窗口,成功了
缺点:污染全局变量,容易被别人无意篡改。比如我在引入这个页面的js后面再引用其他js的时候,在后面的js中设置var me = "monkindey",那么你再点击那个页面的按钮的时候它会弹出123,为不是ContactTelPanel对象
3 简单运用了闭包
代码:handler : function(){me.press(me)} 注:me就是ContactTelPanel对象,因为在function中this指针已经是button对象了,所以应该在function外面用me(或者其他变量名)保存this对象,即var me = this
出现的情况:这个当然是成功
4 用call来实现函数绑定
代码:handler : function(){ me.press.call(this,me);}
个人觉得:这个应该才是最好用的

安装软件时依赖冲突的万能解决方案,布布扣,bubuko.com

时间: 2025-01-01 21:27:49

安装软件时依赖冲突的万能解决方案的相关文章

[Liunx]apt-get安装软件:依赖冲突问题及解决

正常使用apt-get install安装出现依赖冲突问题: 大概是这样: [email protected]:~$ sudo apt-get install gcc-5-base:i386 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 gcc-5-base:i386 已经是最新版 (5.4.0-6ubuntu1~16.04.11). gcc-5-base:i386 已设置为手动安装. 您可能需要运行"apt-get -f install"来

apt-get install安装软件时出现依赖错误解决方案

在使用apt-get install安装软件时,经常会遇到如上图所示错误,该错误的意思为缺少依赖软件,解决方案为: aptitude install golang-go 版权声明:本文为博主原创文章,未经博主允许不得转载.

ubuntu采用apt-get安装软件出现依赖问题的解决方案

ubuntu采用apt-get安装软件出现依赖问题的解决方案 ubuntu采用apt-get安装软件出现依赖问题的解决方案 1:ubuntu采用apt-get安装软件原则上是不会出现包依赖的问题的,出现这种问题大多是"源"的问题,需要你更新一下源 2:更新源 #sudo apt-get update 5:再次用apt-get安装软件就可以了,亲测成功 例如:下面是Ubuntu 12.0.4 下安装SSH时出现 依赖问题 如图片: 第二步:#sudo apt-get update 第三步

apt-get install安装软件时出现依赖错误解决方式

在使用apt-get install安装软件时,常常会遇到如上图所看到的错误.该错误的意思为缺少依赖软件.解决方式为: aptitude install golang-go

在ubuntu中我们使用sudo apt-get install 或者dpkg -i *.deb安装软件时,常常提示“有未能满足的依赖关系“,解决方法

很早之前在ubuntu安装软件时遇到的问题,今天打开ubuntu看到了,总结如下: 在ubuntu中我们使用sudo apt-get install 或者dpkg -i *.deb安装软件常常提示"有未能满足的依赖关系",这是因为当前软件源中依赖库的版本不满足软件的要求. 解决办法: 步骤1:更新软件源.ubuntu自带的软件源比较旧,很多的软件版本较低,国内比较好用的源有阿里源: sudo cp /etc/apt/sources.list /etc/apt/sources.list.

【转】ubuntu 11.04使用apt-get安装软件时一直提示E:unable to locate package

问题: VMware虚拟机安装了ubuntu 11.04,在使用apt-get安装软件时一直提示E:Unable to locate package. 百度了原因,说是要更新源,使用命令:sudo apt-get update更新了,但更新之后问题还是存在: 解决方案: 主要还是源的问题,目前网上找的很多源都是很久以前的了,很多的可能都不能用了: 然后自己重新下载了一个ubuntu 14.04版本的源替换原来的sources.list文件,然后运行sudo apt-get update更新后就可

CentOS 安装软件时,错误Transaction check error ... file...conflicts with file from package zzz的解决

CentOS 安装软件时(比如:# yum install subversion),有时候会碰到类似如下的错误: Transaction check error: file /usr/lib64/libsvn_client-1.so.0.0.0 from install of subversion-1.8.11-1.x86_64 conflicts with file from package subversion-libs-1.7.14-7.el7_0.x86_64 file /usr/lib

[原]linux安装软件时提示找不到镜像的问题:Couldn't resolve host 'mirrorlist.centos.org'

问题:[[email protected] ~]# yum -y install gcc-*Loaded plugins: fastestmirror, prestoCould not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os error was14: PYCURL ERROR 6 - "Couldn't resolve host 'mirrorlist.cent

easy_install 和pip安装软件时使用指定的 源地址

一般来说,使用国外的网站安装软件有些速度会很慢,因此在安装软件时可以使用国内的网站. 1.临时改变 使用easy_install安装pip时有时就会很慢,因此可以更换软件源地址: easy_install -i https://mirrors.aliyun.com/pypi/simple pip 同时pip安装软件时也可以使用指定的源地址安装软件: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml 2.永久改变 也可以通过设