posts - 138, comments - 1881, trackbacks - 97, articles - 13
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

继承自Control的简单Template

Posted on 2006-11-01 15:31 Cat Chen 阅读(360) 评论(18)  编辑 收藏 网摘 所属分类: JavaScript
// Cattism.GCamp.Template
Cattism.GCamp.UI.Template = function Cattism$GCamp$UI$Template(element)
{
    
var e = Function._validateParams(arguments, [
        
{name: "element", type: Sys.UI.DomElement}
    ]);
    
if (e) throw e;
    
    Cattism.GCamp.UI.Template.initializeBase(
this, [element]);
}


Cattism.GCamp.UI.Template.prototype.createInstance 
= function Cattism$GCamp$UI$Template$createInstance()
{
    
var result = new Sys.Preview.UI.TemplateInstance();
    result.instanceElement 
= this._element.cloneNode(true);
    
return result;
}


Cattism.GCamp.UI.Template.registerClass(
"Cattism.GCamp.UI.Template", Sys.UI.Control, Sys.Preview.UI.ITemplate);

Feedback

#1楼   回复  引用    

2006-11-20 16:41 by 网鱼[匿名][未注册用户]
请问您的这段代码怎么用啊,我把这段代码放到我的页面上提示Cattism未定义.
这是怎么回事啊.我是把您的"使用$create的DragDropList与DraggableItem声明"里的代码放在这段代码后面用的。
能不能给段完整的代码让我们可以参考一下.多谢了。

#2楼[楼主]   回复  引用  查看    

2006-11-20 19:20 by Cat Chen      
@网鱼[匿名]
是这样的,Cattism.GCamp.UI是我自定义的namespace,如果你自己用的话请替换成你的项目的namespace,如果你不需要namespace可以直接把它去掉。

注册namespace的方法为Type.registerNamespace,例如Type.registerNamespace("Cattism.GCamp.UI")。

#3楼   回复  引用    

2006-11-21 11:08 by 网鱼[匿名][未注册用户]
我按您的提示,把代码里的Cattism.GCamp.UI都去掉了,原来的错误没有了,不过又来了一个新的错误,我的JS功底确实不怎么样.还请您在指教一下.代码如下.
<script language="jscript">

function App_Init()
{
Template = function Template(element)
{
var e = Function._validateParams(arguments, [
{name: "element", type: Sys.UI.DomElement}
]);
if (e) throw e;

Template.initializeBase(this, [element]);
}

Template.prototype.createInstance = function Template$createInstance()
{
var result = new Sys.Preview.UI.TemplateInstance();
result.instanceElement = this._element.cloneNode(true);
return result;
}

Template.registerClass("Template", Sys.UI.Control, Sys.Preview.UI.ITemplate);

Template = function Template(element)
{
var e = Function._validateParams(arguments, [
{name: "element", type: Sys.UI.DomElement}
]);
if (e) throw e;

Template.initializeBase(this, [element]);
}

Template.prototype.createInstance = function Template$createInstance()
{
var result = new Sys.Preview.UI.TemplateInstance();
result.instanceElement = this._element.cloneNode(true);
return result;
}

Template.registerClass("Template", Sys.UI.Control, Sys.Preview.UI.ITemplate);


var dropCueTemplate = $create(Template, {}, {}, {}, $get("dropCueTemplate"));
var emptyTemplate = $create(Template, {}, {}, {}, $get("emptyTemplate"));

var c_1_div$DragDropZoneBehavior = $create(dragDropList,
{
dragDataType: "HTML",
acceptedDataTypes: ["HTML"],
dragMode: Sys.Preview.UI.DragMode.Move,
direction: Sys.Preview.UI.RepeatDirection.Vertical,
dropCueTemplate: dropCueTemplate,
emptyTemplate: emptyTemplate
}, {}, {}, $get("c_1_div"));

var c_2_div$DragDropZoneBehavior = $create(dragDropList,
{
dragDataType: "HTML",
acceptedDataTypes: ["HTML"],
dragMode: Sys.Preview.UI.DragMode.Move,
direction: Sys.Preview.UI.RepeatDirection.Vertical,
dropCueTemplate: dropCueTemplate,
emptyTemplate: emptyTemplate
}, {}, {}, $get("c_2_div"));

var memberPart$DraggableItemBehavior = $create(Sys.Preview.UI.DraggableListItem,
{
handle: $get("m_30_h")
}, {}, {}, $get("m_30"));

var memberPart$DraggableItemBehavior = $create(Sys.Preview.UI.DraggableListItem,
{
handle: $get("m_31_h")
}, {}, {}, $get("m_31"));


</script>

现在我的IE是
行: 667
字符:5
错误:Sys.ArgumentException:Value is not the name of an existing type.
   Parameter name : typeName
代码:0


不知道var c_1_div$DragDropZoneBehavior = $create(dragDropList...
这句话是不是需要写成var c_1_div$DragDropZoneBehavior = $create(Sys.Preview.UI.dragDropList...

#4楼[楼主]   回复  引用  查看    

2006-11-21 12:00 by Cat Chen      
@网鱼[匿名]
上面给出的Template代码不是直接放在App_Init中使用的,就好像你用C#声明一个类时把代码放到一个独立的cs文件中,你需要把Template的声明放到独立的js中然后引用,接着你就能使用$create来创建Template了。

这和你在cs中声明一个继承自Control的类,然后在aspx中使用有点类似。

#5楼   回复  引用    

2006-11-21 16:16 by 网鱼[匿名][未注册用户]
刚刚看了一下些命名空间的文章,大概知道了怎么回事了,
我也把Template的代码拿出去放到一个单独的JS文件里了。
Template的问题解决,没有报错,但是在
var c_2_div$DragDropZoneBehavior = $create(dragDropList,
{ ...

的时候报错,说dragDropList未定义,你的代码中Cattism.GCamp.UI.这个命名空间是不是继承了什么方法.
如果我不用命名空间的话该怎么定义dragDropList呢,用命名空间的话又该如何定义呢?

最后谢谢Cat Chen 能在工作时间回答我提问.看来我的项目又有希望了。

#6楼   回复  引用    

2006-11-21 16:22 by 网鱼[匿名][未注册用户]
我在dragDropList前面加入Sys.Preview.UI.结果报Sys.ArgumentUndefindeException:Value connot be Undefinde.
   Parameter name : type

看起来 dragDropList 好象是在 Sys.Preview.UI.下的,但是是不是我参数传的有问题啊?

#7楼[楼主]   回复  引用  查看    

2006-11-21 16:26 by Cat Chen      
@网鱼[匿名]
在用$create时必须用完整的写法,也就是Sys.Preview.UI.DragDropList。

#8楼[楼主]   回复  引用  查看    

2006-11-21 16:29 by Cat Chen      
@网鱼[匿名]
至于我继承自DragDropList的那个修改版本你可以参考这里:
http://www.cnblogs.com/cathsfz/archive/2006/10/27/541387.aspx">http://www.cnblogs.com/cathsfz/archive/2006/10/27/541387.aspx

#9楼   回复  引用    

2006-11-22 10:48 by 网鱼[匿名][未注册用户]
耶~!成功了。非常感谢Cat Chen。
接下来研究对自动生成的div自动生成拖动声明。
如果碰到问题还请Cat Chen再次指教。

#10楼[楼主]   回复  引用  查看    

2006-11-22 11:24 by Cat Chen      
@网鱼[匿名]
好的,没问题。

#11楼   回复  引用    

2006-11-22 17:15 by 网鱼[匿名][未注册用户]
Cat Chen 不好意思,我又碰到了一个问题。不知道你是怎么解决的。问题如下:
var c_1_div$DragDropZoneBehavior = $create(MyDragDropList,
{
dragDataType: "HTML",
acceptedDataTypes: ["HTML"],
dragMode: Sys.Preview.UI.DragMode.Move,
direction: Sys.Preview.UI.RepeatDirection.Vertical,
dropCueTemplate: dropCueTemplate,
emptyTemplate: emptyTemplate
}, {}, {}, $get("c_1"));

当$get("c_1"))里的C_1为DIV控件时,拖动的层要放到这个c_1里定位很困难(c_1里面为空),也就是说c_1为空的时候他的高度很小,想要把拖动的层放到里面需要定位到c_1这个DIV里面很困难。c_1的高度需要里面有东西才能撑大。而如果把c_1换成是一个<td></td>的时候虽然高度可以固定作用域很大,但是dropCueTemplate: dropCueTemplate显示的虚线框会变形,变得很小。
不知道Cat Chen您是怎么处理这个问题的?

#12楼[楼主]   回复  引用  查看    

2006-11-22 18:29 by Cat Chen      
这通过设置emptyTemplate解决,你可以为emptyTemplate设置height属性。

#13楼   回复  引用    

2006-11-23 14:48 by 网鱼[匿名][未注册用户]
您说的方法不太好用啊.比如说我们的页面上现在只有3列 $get("c_1"),
但是只有1列 $get("c_1")有个DIV其他的两个 $get("c_1")都没有DIV也就是为空,在页面刚打开的时候emptyTemplate是不会在空的$get("c_1")里面出现的。只有拖动以后$get("c_1")为空了,emptyTemplate才会在$get("c_1")里面出现.当然除非可以控制emptyTemplate在页面打开的时候
对空的$get("c_1")进行填充.我也有试过,但是失败了,不知道Cat Chen 您是否有更好的方法

#14楼[楼主]   回复  引用  查看    

2006-11-23 16:17 by Cat Chen      
@网鱼[匿名]
如果你有一个div用作DragDropList,并且一开始就为空,那么你一开始就在用emptyTemplate.createInstance创建一个emptyTemplate节点的实体,然后把它添加为该div的子元素。

#15楼   回复  引用    

2006-11-24 11:01 by 网鱼[匿名][未注册用户]
不好意思,我写出来以后会报错,可能写法有问题,您可以给一个完整点的写法吗?
我是这么写的:
$get("c_"+i+"_div").appendChild(emptyTemplate.createInstance);

#16楼[楼主]   回复  引用  查看    

2006-11-25 22:16 by Cat Chen      
@网鱼[匿名]
首先确认你已经执行了emptyTemplate = $create(...)的操作初始化,然后:
$get("c_"+i+"_div").appendChild(emptyTemplate.createInstance());

别忘记了createInstance后面的(),这样才是指函数执行结果,否则就是指函数。你尝试将一个函数添加到DOM上面去当然不行。

#17楼   回复  引用    

2006-11-27 14:24 by 网鱼[匿名][未注册用户]
还是有问题啊Cat老大.好象appendChild接口不能用啊。
我这么写的:
var d=document.createElement("div");
d.id="m_"+UrlID;
d.className="modbox";
d.innerHTML=m_DivContert;
$get("c_1_div").appendChild(d);
alert(d);
var tempEmptyDiv=emptyTemplate.createInstance();
  alert(tempEmptyDiv);
if(tempEmptyDiv)
{
$get("c_2_div").appendChild(tempEmptyDiv);
}
第一个alert(d)弹出[object],第二个alert(tempEmptyDiv)弹出为[object Object]第一个appendChild能成功,第二个就会报错,错误内容为htmlfile: 不支持此接口...

先前emptyTemplate = $create(...)已经执行过了。
不知道还有没有别的方法可以实现.

#18楼[楼主]   回复  引用  查看    

2006-11-27 18:07 by Cat Chen      
@网鱼[匿名]
不好意思,又犯低级错误了,应该是emptyTemplate.createInstance().instanceElement。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 546844




相关文章:

相关链接: