# Find/Replace Binding Type

**URL:** <https://forum.inductiveautomation.com/t/find-replace-binding-type/104740>\
**Category:** Ignition\
**Tags:** perspective\
**Created:** [April 4, 2025, 8:43pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740 "2025-04-04T20:43:37Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![BigByte](https://avatars.discourse-cdn.com/v4/letter/b/f17d59/32.png) [@BigByte](https://forum.inductiveautomation.com/u/BigByte)\
**Post date:** [April 4, 2025, 8:43pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/1 "2025-04-04T20:43:37Z")

</div>

I have a bunch of components with Tag bindings, and I now want to parameterize these tags and will need to make them Expression bindings instead. I know I can easily find/replace the text, but it will then be the wrong binding type. Is there any way to mass-change them all to Expression bindings, or will I have to go through one by one?

---

<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:** [April 4, 2025, 8:55pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/2 "2025-04-04T20:55:14Z")

</div>

Why would parameterization require changing to expressions? (Normally, you'd change your direct tag bindings to indirect tag bindings.)

And yes, pretty much always one-by-one. Because you will also need to add parameters to your views to reference in your indirect tag bindings.

---

<div class="post-metadata">

**Author:** ![BigByte](https://avatars.discourse-cdn.com/v4/letter/b/f17d59/32.png) [@BigByte](https://forum.inductiveautomation.com/u/BigByte)\
**Post date:** [April 4, 2025, 9:09pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/3 "2025-04-04T21:09:02Z")

</div>

I was copying something a colleague did. They had parameters passed into the View, and a custom property in the root container to build a string for the tag folder. Then on all their bindings, they're using `tag({/root.custom.tagFolder} + "tagName")`. On the places where I already used an Expression binding, I was able to easily find/replace the hard-coded folder with the custom property. But I don't see a way to change my existing Direct Tag bindings to something else.

Like you're saying, I guess I could use Indirect or even Expression Tag bindings (instead of the normal Expression Binding), but still, is there any way to easily mass-swap them off of Direct bindings?

Edit: Oh, yeah. I'm not going to be able to do normal Expression bindings because I'll need some of them to be bidirectional. I can do `concat()` instead of `tag()` in an Expression Tag binding and it'll work, I'd just need an easy way to mass-swap them off of Direct binding after/when I do the folder string replace.

---

<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:** [April 4, 2025, 10:10pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/4 "2025-04-04T22:10:54Z")

</div>

Do not use the `tag()` expression function in UI bindings. _ **Ever.** _

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 10:26pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/5 "2025-04-04T22:26:07Z")

</div>

Technically, since Perspective config is all `view.json` files on disk, you could (in theory) come up with a `jq` snippet to run on the command line that recursively processes all your views.

Where this approach lands on the automation graph is anyone's guess:

 ![automation](https://us1.discourse-cdn.com/inductiveautomation/original/3X/3/8/3882da387e03bf035dd0468e4d06ea4662ad47fa.png)

---

<div class="post-metadata">

**Author:** ![Leor\_Fishman](https://avatars.discourse-cdn.com/v4/letter/l/e19adc/32.png) [@Leor\_Fishman](https://forum.inductiveautomation.com/u/Leor_Fishman)\
**Post date:** [April 4, 2025, 10:55pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/6 "2025-04-04T22:55:11Z")

</div>

doing this in jq instead of python for actual dict processing is a deeply confusing take

---

<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:** [April 4, 2025, 10:56pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/7 "2025-04-04T22:56:35Z")

</div>

> [@Leor\_Fishman](#):
>
> deeply confusing take

Paul is trying to nerd-snipe you. He sometimes succeeds on me, but not with `jq`. 😐

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 11:30pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/8 "2025-04-04T23:30:23Z")

</div>

Split this topic on April 4, 2025, 11:30pm UTC

7 posts were merged into an existing topic: [How expensive is each WebDev route](https://forum.inductiveautomation.com/t/how-expensive-is-each-webdev-route/104691/7)

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [April 4, 2025, 10:59pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/10 "2025-04-04T22:59:50Z")

</div>

Well, considering he’s done similar things in the past perhaps he’s just trying to keep himself from being sniped.

> [@How to create / append bulk tooltips via script with json export?](https://forum.inductiveautomation.com/t/how-to-create-append-bulk-tooltips-via-script-with-json-export/50072/3):
>
> Thanks. And to clarify, im trying to append tooltips into the .json TAG EXPORT, then import them back in, not a window/view. (almost all of our applications are in vision) Im not sure i follow. i get the decode and encode. If you do have an executable would it be to much for me to ask for a copy? Ever since IA got away from CSV tag exports its made manipulating tags very difficult.(i realize there is always a way with scripting but im a novice at python/scripting at best) as we migrate more…

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [April 4, 2025, 11:32pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/11 "2025-04-04T23:32:39Z")

</div>

> [@Leor\_Fishman](#):
>
> doing this in jq instead of python for actual dict processing is a deeply confusing take

Horses for courses.  
JSON manipulation of a deep file tree _preserving everything else in the JSON structure unmodified_ is a more convoluted task than it seems at a glance in Python.

And LLMs are excellent at spitting out `jq` incantations; I've never even attempted to learn its syntax and it's served me just fine.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [April 5, 2025, 12:04pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/12 "2025-04-05T12:04:51Z")

</div>

> [@paul-griffith](#):
>
> spitting out `jq` incantations; I've never even attempted to learn its syntax

I'm still convinced it doesn't have a syntax. You just mash things together and sometimes it works, sometimes you hit the randomise button again and you get lucky the 2nd time, or not 🤷

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [April 5, 2025, 12:08pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/13 "2025-04-05T12:08:13Z")

</div>

Also

> [@BigByte](#):
>
> want to parameterize these tags and will need to make them Expression bindings instead

> [@BigByte](#):
>
> Then on all their bindings, they're using `tag({/root.custom.tagFolder} + "tagName")`

> [@pturmel](#):
>
> Do not use the `tag()` expression function in UI bindings. _ **Ever** _

As I read each line I predicted what was to follow 😂

---

<div class="post-metadata">

**Author:** ![BigByte](https://avatars.discourse-cdn.com/v4/letter/b/f17d59/32.png) [@BigByte](https://forum.inductiveautomation.com/u/BigByte)\
**Post date:** [April 7, 2025, 1:08pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/14 "2025-04-07T13:08:20Z")

</div>

> [@pturmel](#):
>
> Do not use the `tag()` expression function in UI bindings. _ **Ever.** _

What's wrong with the `tag()` function?

In one spot, I have an Expression binding to take the inverse of a bool tag, and I have `!tag("parameterized_tag_string")` I tried doing `concat()` on the Tag Expression binding, but it didn't seem to work with the not operator. How would you recommend I do this? One solution I can see would be to make a custom property and bind it to the tag using `concat()`, and then bind the inverse of the custom property to the actual property, but is there a better way? I also am using the `tag()` function in if statements elsewhere.

---

<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:** [April 7, 2025, 1:17pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/15 "2025-04-07T13:17:05Z")

</div>

Numerous performance and initialization problems. This forum is full of discussions of people's bad experiences with `tag()`.

Move the entire `tag()` subexpression to an indirect tag binding on a custom property, and use that custom property in its place in the original expression.

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [April 7, 2025, 1:23pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/16 "2025-04-07T13:23:38Z")

</div>

> [@BigByte](#):
>
> bind it to the tag using `concat()`

There is generally no need for `concat()` in this context either, as this is exactly the problem that Indirect Tag Bindings were made to solve.

---

<div class="post-metadata">

**Author:** ![BigByte](https://avatars.discourse-cdn.com/v4/letter/b/f17d59/32.png) [@BigByte](https://forum.inductiveautomation.com/u/BigByte)\
**Post date:** [April 7, 2025, 1:42pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/17 "2025-04-07T13:42:35Z")

</div>

Yeah, I know it's not necessary, but it would be faster to copy/paste the `concat()` function I already have than to remake it as an indirect binding. But actually, I think I will take the extra time to make them indirect bindings.

I think my final approach will have to be going one-by-one since I don't know anything about `jq` to automate changing Direct bindings to Indirect bindings. And in places where I have expressions (nots, if statements, etc.), I can still use the Indirect Tag binding with an Expression transform. I'd like to avoid using Custom properties if I can. I'm working in an RDP, and it seems like sometimes when I'm creating Custom properties, the RDP connection freezes. I know correlation doesn't mean causation, but it still feels better to have everything contained in a single binding/property.

---

<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:** [April 7, 2025, 1:48pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/18 "2025-04-07T13:48:06Z")

</div>

> [@BigByte](#):
>
> I can still use the Indirect Tag binding with an Expression transform.

You should avoid transforms, too, for performance. A separate custom property for the indirect tag binding is substantially better.

Ignition provides many ways to solve data flow problems, but they are not all equally good.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [April 7, 2025, 1:52pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/19 "2025-04-07T13:52:51Z")

</div>

> [@pturmel](#):
>
> A separate custom property for the indirect tag binding is substantially better.

Even if you're only using the tag value in the one spot?  
(For troubleshooting and testing it's obviously better to have a separate prop with the tag binding)

---

<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:** [April 7, 2025, 1:56pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/20 "2025-04-07T13:56:40Z")

</div>

> [@nminchin](#):
>
> Even if you're only using the tag value in the one spot?

Yes, it seems so. (I haven't _exhaustively_ tested this.) It is important to mark the custom property as private for best results.

Transforms have significant overhead, and require all parts of the binding to execute every time. Having separate properties with separate bindings means only the parts that _ **need** _ to execute (due to reference changes) will consume CPU.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [April 7, 2025, 2:01pm UTC](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740/21 "2025-04-07T14:01:32Z")

</div>

Is the rule to basically set _all_ custom props to private? I assume no props/position/meta property groups can be made private? What about params?

[Next page](https://forum.inductiveautomation.com/t/find-replace-binding-type/104740.md?page=2)
