all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH widget-toolkit] cbind: document cbind by adding a small summary and example
Date: Mon, 25 Oct 2021 09:26:26 +0200	[thread overview]
Message-ID: <20211025072626.1005625-1-d.csapak@proxmox.com> (raw)

Explain the use-case, the difference to normal binds, and give an
example that contains all features that can be used with explanations.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/mixin/CBind.js | 78 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/src/mixin/CBind.js b/src/mixin/CBind.js
index 8b4153c..71c0b56 100644
--- a/src/mixin/CBind.js
+++ b/src/mixin/CBind.js
@@ -1,3 +1,81 @@
+/*
+ * The Proxmox CBind mixin is intended to supplement the 'bind' mechanism
+ * of ExtJS. In contrast to the 'bind', 'cbind' only act during creation
+ * of the component, not during its lifetime.
+ *
+ * It is used to dynamically set properties of components during their
+ * creation (like a 'nodename' for example), but not later. It is also no
+ * 'double-bind', meaning that a field which has its value 'cbind' will
+ * not change the value of the 'cbind' when the value of the field changes.
+ *
+ * We use it to get a 'declarative' approach to component declaration, even
+ * when we need to set some properties of sub-components dynamically.
+ * This reduces the code in the 'initComponent' and instead we can statically
+ * declare items,buttons,tbars, etc. with the dynamic parts in the 'cbind'.
+ *
+ * It is used like in the following example:
+ *
+ * Ext.define('Some.Component', {
+ *     extend: 'Some.other.Component',
+ *
+ *     // first it has to be enabled
+ *     mixins: ['Proxmox.Mixin.CBind'],
+ *
+ *     // then a base config has to be defined. this can be a function,
+ *     // which has access to the initial config and can store persistent
+ *     // properties, as well as return temporary ones (which only exist during
+ *     // the cbind process)
+ *     // this function will be called before 'initComponent'
+ *     cbindData: function(initialconfig) {
+ *         // 'this' here is the same as in 'initComponent'
+ *         let me = this;
+ *         me.persistentProperty = false;
+ *         return {
+ *             temporaryProperty: true,
+ *         };
+ *     },
+ *
+ *     // if there is no need for persistent properties,
+ *     // it can also simply be an object
+ *     cbindData: {
+ *         temporaryProperty: true,
+ *         // properties itself can also be functions that will be evaluated
+ *         // before replacing the values
+ *         dynamicProperty: (cfg) => !cfg.temporaryProperty,
+ *         // they can be any value
+ *         numericProp: 0,
+ *         // even objects
+ *         objectProp: {
+ *             foo: 'bar',
+ *             bar: 'baz',
+ *         }
+ *     },
+ *
+ *     // you can 'cbind' the component itself, here the 'target' property
+ *     // will be replaced with the content of 'temporaryProperty' (true)
+ *     // before the component is initialized
+ *     cbind: {
+ *          target: '{temporaryProperty}',
+ *     },
+ *
+ *     // you can also 'cbind' values of nested items/etc. like this
+ *     items: [
+ *         {
+ *             xtype: 'checkbox',
+ *             cbind: {
+ *                 // you can negate a property with prefixing '!'
+ *                 value: '{!persistentProperty}',
+ *                 // access to properties of objects can be done like this
+ *                 object: '{objectProp.foo}'
+ *                 // and it can be a function too, when you need more
+ *                 // complicated logic ('dynamic' will get set to 1 here)
+ *                 dynamic: (get) => get('numericProp') + 1,
+ *             },
+ *         },
+ *     ],
+ * });
+ */
+
 Ext.define('Proxmox.Mixin.CBind', {
     extend: 'Ext.Mixin',
 
-- 
2.30.2





             reply	other threads:[~2021-10-25  7:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-25  7:26 Dominik Csapak [this message]
2021-10-25  8:59 ` Aaron Lauterer
2021-10-25  9:05 ` Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211025072626.1005625-1-d.csapak@proxmox.com \
    --to=d.csapak@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal