FieldReplicator.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:3k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.ns("Ext.ux");
  2. /**
  3.  * @class Ext.ux.FieldReplicator
  4.  * <p>A plugin for Field Components which creates clones of the Field for as
  5.  * long as the user keeps filling them. Leaving the final one blank ends the repeating series.</p>
  6.  * <p>Usage:</p>
  7.  * <pre><code>
  8.     {
  9.         xtype: 'combo',
  10.         plugins: [ Ext.ux.FieldReplicator ],
  11.         triggerAction: 'all',
  12.         fieldLabel: 'Select recipient',
  13.         store: recipientStore
  14.     }
  15.  * </code></pre>
  16.  */
  17. Ext.ux.FieldReplicator = {
  18.     init: function(f) {
  19.         f.replicator = this;
  20.         f.enableKeyEvents = true;
  21.         f.on('change', this.onChange, this);
  22.         f.onKeyDown = f.onKeyDown.createInterceptor(this.onKeyDown);
  23.     },
  24. //  If tabbing out and the change event will be fired, flag that
  25. //  the change handler must focus the correct sibling Field.
  26.     onKeyDown: function(e) {
  27.         if ((e.getKey() == Ext.EventObject.TAB) && (String(this.startValue) !== String(this.getValue()))) {
  28.             if (e.shiftKey) {
  29.                 this.focusPrev = true;
  30.             } else if (!e.shiftKey && !e.altKey) {
  31.                 this.focusNext = true;
  32.             }
  33.         }
  34.     },
  35. //  Handle the field either being changed to blank or from blank.
  36.     onChange: function(f, n, o) {
  37.         var c = f.ownerCt, l,
  38.             ps = f.previousSibling(),
  39.             ns = f.nextSibling();
  40.         if (Ext.isEmpty(n)) {
  41.             if (!Ext.isEmpty(o)) {
  42. //              The Field has been blanked, and it is not the only one left, remove it
  43.                 if ((ps && (ps.replicator === this)) || (ns && (ns.replicator === this))) {
  44.                     l = f.findParentBy(function(p) {
  45.                         return !Ext.isDefined(p.ownerCt);
  46.                     });
  47.                     c.remove(f);
  48.                     l.doLayout();
  49.                 }
  50.             }
  51.         } else {
  52.             if (Ext.isEmpty(o)) {
  53. //              Field filled, insert a clone as the next sibling
  54.                 ns = new f.constructor(f.cloneConfig());
  55.                 c.insert(c.items.indexOf(f) + 1, ns);
  56.                 c.doLayout();
  57.                 l = f.findParentBy(function(p) {
  58.                     return !Ext.isDefined(p.ownerCt);
  59.                 });
  60.                 l.doLayout();
  61.             }
  62.         }
  63.         if (f.focusPrev) {
  64.             delete f.focusPrev;
  65.             ps.focus(false, true);
  66.         } else  if (f.focusNext) {
  67.             delete f.focusNext;
  68.             ns.focus(false, true);
  69.         }
  70.     }
  71. };