# Create Customizer with Property dropdown

**URL:** <https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306>\
**Category:** Module Development\
**Tags:** ignition81, vision\
**Created:** [May 15, 2025, 3:11pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306 "2025-05-15T15:11:59Z")\
**Posts on this page:** 12\
**Page:** 3

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [June 6, 2025, 5:48pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/42 "2025-06-06T17:48:06Z")

</div>

When a binding subscribes to a tag, it hands the tag provider a tag change listener. That is the real consumer. Your shim must save that in a final field when creating the intermediate tag change listener your shim will hand to the real tag provider. Your shim's intermediate listener objects must be 1:1 with real consumers, and you will have to keep track of them in the shim for later unsubscription. The shim's intermediate listener must have a non-final field to hold the most recent real-time QV. And then whatever else you need for your simulation.

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [June 6, 2025, 5:59pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/43 "2025-06-06T17:59:36Z")

</div>

How do I access a tag change listener that has been created and attached to the binding outside of my code? I already keep track of the most recent QV in my wrapper. I think the only piece I am missing is the real consumer tag change listener. I am also already keeping track of intermediate listeners, as I struggled with leaking listeners in early testing.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [June 6, 2025, 7:47pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/44 "2025-06-06T19:47:40Z")

</div>

After you've replaced the tag provider, all future tag subscriptions will be routed to your provider shim. Create the intermediate subscription objects then, unconditionally.

You cannot obtain those listeners any other way. (You have to handle all subscriptions for the provider you are intercepting, whether you plan to simulate them or not.)

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [June 6, 2025, 7:50pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/45 "2025-06-06T19:50:49Z")

</div>

> [@pturmel](#):
>
> all future tag subscriptions

THIS is why I am required to refresh the binding, because the subscription for the binding is created before my shim provider has been created. I can intercept subscriptions just fine, it is the overriding of the existing subscription (between the real consumer and the default tag provider) that is the problem.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [June 6, 2025, 7:52pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/46 "2025-06-06T19:52:13Z")

</div>

> [@Porter\_Ellis](#):
>
> because the subscription for the binding is created before my shim provider has been created

When are you installing your shim? (It should be in your ClientHook.startup() method. Or perhaps in the constructor.)

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [June 6, 2025, 7:53pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/47 "2025-06-06T19:53:51Z")

</div>

Ahhh.... that might be the issue. I have been instantiating the shim in the startup method of my custom vision component. I will attempt and report.

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [June 6, 2025, 9:05pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/48 "2025-06-06T21:05:39Z")

</div>

That did the trick for a true client session. Now I just need to be able to pass the client context to the designer session so developers can test before deployment. Thank you for all your help!!

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [August 19, 2025, 3:50pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/49 "2025-08-19T15:50:58Z")

</div>

I have encountered an issue with expression functions that rely on tag values. As a specific example, the `tag()` function. My historical values are not being propagated to these bindings when in simulation mode. I read that expressions do not rely on the typical tag subscription to retrieve values. Do expression functions have the same lifecycle as a typical tag binding, or are they reliant on the `readAsync()` function in the tag provider to query values at a specific rate?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 19, 2025, 4:23pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/50 "2025-08-19T16:23:41Z")

</div>

`tag()` uses a normal subscription, IIRC. (Though you shouldn't allow `tag()` anywhere in a Vision application.)

---

<div class="post-metadata">

**Author:** ![Porter\_Ellis](https://avatars.discourse-cdn.com/v4/letter/p/ed8c4c/32.png) [@Porter\_Ellis](https://forum.inductiveautomation.com/u/Porter_Ellis)\
**Post date:** [August 19, 2025, 4:25pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/51 "2025-08-19T16:25:01Z")

</div>

Why not? Because an indirect tag binding is more efficient?

---

<div class="post-metadata">

**Author:** ![ryan.white](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryan.white/32/73193_2.png) [@ryan.white](https://forum.inductiveautomation.com/u/ryan.white)\
**Post date:** [August 19, 2025, 4:26pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/52 "2025-08-19T16:26:24Z")

</div>

> [@Indirect Tags versus Tag() function](https://forum.inductiveautomation.com/t/indirect-tags-versus-tag-function/95947/2):
>
> Every difference in behavior between the tag() function and indirect tag bindings is a negative against the tag() function. tag(), like any expression function, must deliver an answer in the thread that is running the whole expression. But on expression startup that means waiting on the tag subsystem to establish the subscription and deliver the initial value. This creates stalls. Indirect tag bindings deliver asynchronously. The string expression within the parentheses of tag() must re…

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [August 19, 2025, 4:29pm UTC](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306/53 "2025-08-19T16:29:41Z")

</div>

I have many rants on this forum about the `tag()` expression function....

[Previous page](https://forum.inductiveautomation.com/t/create-customizer-with-property-dropdown/106306.md?page=2)
