Ext.Tree扩展CheckBox方法

  1. /**  
  2. * @class Ext.tree.TreeCheckNodeUI  
  3. * @extends Ext.tree.TreeNodeUI  
  4.  
  5. * 对 Ext.tree.TreeNodeUI 进行checkbox功能的扩展,后台返回的结点信息不用非要包含checked属性  
  6.  
  7. * 扩展的功能点有:  
  8. * 一、支持只对树的叶子进行选择  
  9. * 只有当返回的树结点属性leaf = true 时,结点才有checkbox可选  
  10. * 使用时,只需在声明树时,加上属性 onlyLeafCheckable: true 既可,默认是false  
  11.  
  12. * 二、支持对树的单选  
  13. * 只允许选择一个结点  
  14. * 使用时,只需在声明树时,加上属性 checkModel: "single" 既可  
  15.  
  16. * 二、支持对树的级联多选  
  17. * 当选择结点时,自动选择该结点下的所有子结点,以及该结点的所有父结点(根结点除外),特别是支持异步,当子结点还没显示时,会从后台取得子结点,然后将其选中/取消选中  
  18. * 使用时,只需在声明树时,加上属性 checkModel: "cascade" 既可  
  19.  
  20. * 三、添加"check"事件  
  21. * 该事件会在树结点的checkbox发生改变时触发  
  22. * 使用时,只需给树注册事件,如:  
  23. * tree.on("check",function(node,checked){...});  
  24.  
  25. * 默认情况下,checkModel为'multiple',也就是多选,onlyLeafCheckable为false,所有结点都可选  
  26.  
  27. * 使用方法:在loader里加上 baseAttrs:{uiProvider:Ext.tree.TreeCheckNodeUI} 既可.  
  28. * 例如:  
  29. * var tree = new Ext.tree.TreePanel({  
  30. * el:'tree-ct',  
  31. * width:568,  
  32. * height:300,  
  33. * checkModel: 'cascade', //对树的级联多选  
  34. * onlyLeafCheckable: false,//对树所有结点都可选  
  35. * animate: false,  
  36. * rootVisible: false,  
  37. * autoScroll:true,  
  38. * loader: new Ext.tree.DWRTreeLoader({  
  39. * dwrCall:Tmplt.getTmpltTree,  
  40. * baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI } //添加 uiProvider 属性  
  41. * }),  
  42. * root: new Ext.tree.AsyncTreeNode({ id:'0' })  
  43. * });  
  44. * tree.on("check",function(node,checked){alert(node.text+" = "+checked)}); //注册"check"事件  
  45. * tree.render();  
  46.  
  47. */   
  48.   
  49. Ext.tree.TreeCheckNodeUI = function() {   
  50. //'multiple':多选; 'single':单选; 'cascade':级联多选   
  51. this.checkModel = 'multiple';   
  52.   
  53. //only leaf can checked   
  54. this.onlyLeafCheckable = false;   
  55.   
  56. Ext.tree.TreeCheckNodeUI.superclass.constructor.apply(this, arguments);   
  57. };   
  58.   
  59. Ext.extend(Ext.tree.TreeCheckNodeUI, Ext.tree.TreeNodeUI, {   
  60.   
  61. renderElements : function(n, a, targetNode, bulkRender){   
  62. var tree = n.getOwnerTree();   
  63. this.checkModel = tree.checkModel || this.checkModel;   
  64. this.onlyLeafCheckable = tree.onlyLeafCheckable || false;   
  65.   
  66. // add some indent caching, this helps performance when rendering a large tree   
  67. this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';   
  68.   
  69. var cb = (!this.onlyLeafCheckable || a.leaf);   
  70. var href = a.href ? a.href : Ext.isGecko ? "" : "#";   
  71. var buf = ['<li class="x-tree-node"><div class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on" ext:tree-node-id="',n.id,'">',   
  72. '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",   
  73. '<img class="x-tree-ec-icon x-tree-elbow" alt="" src="'this.emptyIcon, '">',   
  74. '<img class="x-tree-node-icon',(a.icon ? " alt="" unselectable="on" src="', a.icon || this.emptyIcon, '">',   
  75. cb ? ('<input class="x-tree-node-cb" type="checkbox" value="on">' : '/>')) : '',   
  76. '<a class="x-tree-node-anchor" hidefocus="hidefocus" tabindex="1" target="'+a.hrefTarget+'" a.hreftarget="" href="',href,'"></a></div>",   
  77. '<ul class="x-tree-node-ct" style="DISPLAY: none"> </ul>',   
  78. ""].join('');   
  79.   
  80. var nel;   
  81. if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){   
  82. this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);   
  83. }else{   
  84. this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);   
  85. }   
  86.   
  87. this.elNode = this.wrap.childNodes[0];   
  88. this.ctNode = this.wrap.childNodes[1];   
  89. var cs = this.elNode.childNodes;   
  90. this.indentNode = cs[0];   
  91. this.ecNode = cs[1];   
  92. this.iconNode = cs[2];   
  93. var index = 3;   
  94. if(cb){   
  95. this.checkbox = cs[3];   
  96. Ext.fly(this.checkbox).on('click'this.check.createDelegate(this,[null]));   
  97. index++;   
  98. }   
  99. this.anchor = cs[index];   
  100. this.textNode = cs[index].firstChild;   
  101. },   
  102.   
  103. // private   
  104. check : function(checked){   
  105. var n = this.node;   
  106. var tree = n.getOwnerTree();   
  107. this.checkModel = tree.checkModel || this.checkModel;   
  108.   
  109. ifchecked === null ) {   
  110. checked = this.checkbox.checked;   
  111. else {   
  112. this.checkbox.checked = checked;   
  113. }   
  114.   
  115. n.attributes.checked = checked;   
  116. tree.fireEvent('check', n, checked);   
  117.   
  118. if(!this.onlyLeafCheckable && this.checkModel == 'cascade'){   
  119. var parentNode = n.parentNode;   
  120. if(parentNode !== null) {   
  121. this.parentCheck(parentNode,checked);   
  122. }   
  123. if( !n.expanded && !n.childrenRendered ) {   
  124. n.expand(false,false,this.childCheck);   
  125. }   
  126. else {   
  127. this.childCheck(n);   
  128. }   
  129. }else if(this.checkModel == 'single'){   
  130. var checkedNodes = tree.getChecked();   
  131. for(var i=0;i0){   
  132. for(var i=0;i</li>  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值