How to search across multiple component templates for text in Angular?

Viewed 78

I have several components on different routes that have mostly static templates. I would like to search those templates for any string and return the matching text content.

I am able to do this by manually copying the text content of each template and storing it in an object. This creates 2 sources of truth for the content of these pages. Meaning every update to one has to also be done in the other.

Is there any way I can architecture this so there is a single source of truth?

Things I've Tried

  1. Keeping all of the html in the data object, but then I lose all the functionality of the components. No routerLink, no shared components (using a dialog component to enlarge images), etc.
  2. Duplicating content into the data object
  3. Keeping all of html in the templates, but then how could I search it...

Potential Ideas

  • Import component templates into the constructor?
    • Then parse them in ngOninit to create the object
    • Not sure this is even possible
  • Store the template text contents in a service
    • Each component would send its text content to the service in ngOninit or ngAfterViewInit
    • But then how would you initialize all of the components if they are on different routes?
  • Have one giant search component that initializes all of the searchable components
    • Sounds like it would have a huge negative impact on performance
    • Edit: Just tried this and yes it makes the app verrry slow

Example Routes

const routes: Routes = [
    {
        path: '',
        component: UserGuideComponent,
        canActivate: [AuthGuard],
        children: [
            {
                path: 'introduction',
                component: IntroductionComponent
            },
            {
                path: 'introduction/quick-links',
                component: QuickLinksComponent
            },
            {
                path: 'build-survey',
                component: BuildSurveyComponent
            },
            {
                path: 'build-survey/content',
                component: ContentComponent
            },
            ...
            // there will be a lot more pages
        ]
    }
];
1 Answers

I'm not 100% clear on the question, although it sounds like having all the text in one location would be a start, and that text could be searchable

If you used ngx-translate your app text would be stored in a single json file. The parsed json could be searched - the keys indicating what component the text is associated with. I've worked on english only apps and we still used this library to manage text. It might be an option

Related