public inbox for pmg-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Thomas Lamprecht <t.lamprecht@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Cc: pmg-devel@lists.proxmox.com
Subject: Re: [pmg-devel] applied: [PATCH] panel/acme-domains: fix cyclic dependency in view model
Date: Tue, 23 Mar 2021 18:27:14 +0100	[thread overview]
Message-ID: <aa29c31c-8177-af6e-a370-2c59ecf0d135@proxmox.com> (raw)
In-Reply-To: <20210323162916.23803-1-t.lamprecht@proxmox.com>

On 23.03.21 17:29, Thomas Lamprecht wrote:
> A view model forumla cannot depend on itself, as that is a dependency
> cycle.
> 
> In this specific case we can just drop the `hasUsage` forumla entry
> completely, it is bogus as it was just returning its value, and that
> is actually taken care of by the `hasUsage` data binding.
> 
> The debug build of ExtJS throws an exception on such cycles, the
> release build does not cares to much and seems to do the right thing
> already here.
> 
> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
> ---
> 
> @Wolfgang, or was there an actual reason this formula got added in the first
> place?
> 
>  src/panel/ACMEDomains.js | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/src/panel/ACMEDomains.js b/src/panel/ACMEDomains.js
> index f66975f..2b6c204 100644
> --- a/src/panel/ACMEDomains.js
> +++ b/src/panel/ACMEDomains.js
> @@ -47,7 +47,6 @@ Ext.define('Proxmox.panel.ACMEDomains', {
>  	    editBtnIcon: (get) => 'fa black fa-' + (get('accountEditable') ? 'check' : 'pencil'),
>  	    accountTextHidden: (get) => get('accountEditable') || !get('accountsAvailable'),
>  	    accountValueHidden: (get) => !get('accountEditable') || !get('accountsAvailable'),

Oh, and note that statements like above may break "change detection" for ExtJS.

With view model formulas, it first executes every formula and records the
keys all the get() calls use, this is then tracked as dependencies for a
formula and used to see what subsequent formulas need to be updated if any
other formula or data binding changes.

So, if on evaluation a get(X) is missed due to it being not always called,
like with boolean statements where a single truthy is enough for an or expression
like above, that data dependency is lost and one may see bug like behaviour.

Use intermediate variables to combat that, for example, above `accountValueHidden`
formula should read:

accountValueHidden: (get) => {
    let editable = get('accountEditable'), available = get('accountsAvailable');
    return !editable || !available;
},

Alternatively, one can tell ExtJS explicitly what a formula binds too:

accountValueHidden: {
    bind: {
        editable: '{accountEditable}',
        available: '{accountsAvailable}',
    },
    get: data => !data.editable || !data.available,
},

https://docs.sencha.com/extjs/6.0.2/guides/application_architecture/view_models_data_binding.html#application_architecture-_-view_models_data_binding_-_formulas_with_explicit_binding






  reply	other threads:[~2021-03-23 17:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-23 16:29 Thomas Lamprecht
2021-03-23 17:27 ` Thomas Lamprecht [this message]
2021-03-23 18:22 Dietmar Maurer
2021-03-24  7:21 ` Thomas Lamprecht
2021-03-24  7:31   ` Dominik Csapak
2021-03-24  7:34     ` 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=aa29c31c-8177-af6e-a370-2c59ecf0d135@proxmox.com \
    --to=t.lamprecht@proxmox.com \
    --cc=pmg-devel@lists.proxmox.com \
    --cc=w.bumiller@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal