Conditionally swap elements position in a row












1















I have a component that displays a row in a grid-system simil-bootstrap. It is as simple as an image on the left and some body text on the right, both pulled dynamically from a CMS.



I am trying to add a condition that would display the text first and then the image, or vice versa.
ng-container and ng-template seems like the way to go, but I can't figure out how.



I am looking for something like:



<ng-container *ngIf="content.switched; then Image and Text; else Text and Image"></ng-container>

<ng-template #Image> ... </ng-template>
<ng-template #Text> ... </ng-template>


Thanks!










share|improve this question



























    1















    I have a component that displays a row in a grid-system simil-bootstrap. It is as simple as an image on the left and some body text on the right, both pulled dynamically from a CMS.



    I am trying to add a condition that would display the text first and then the image, or vice versa.
    ng-container and ng-template seems like the way to go, but I can't figure out how.



    I am looking for something like:



    <ng-container *ngIf="content.switched; then Image and Text; else Text and Image"></ng-container>

    <ng-template #Image> ... </ng-template>
    <ng-template #Text> ... </ng-template>


    Thanks!










    share|improve this question

























      1












      1








      1








      I have a component that displays a row in a grid-system simil-bootstrap. It is as simple as an image on the left and some body text on the right, both pulled dynamically from a CMS.



      I am trying to add a condition that would display the text first and then the image, or vice versa.
      ng-container and ng-template seems like the way to go, but I can't figure out how.



      I am looking for something like:



      <ng-container *ngIf="content.switched; then Image and Text; else Text and Image"></ng-container>

      <ng-template #Image> ... </ng-template>
      <ng-template #Text> ... </ng-template>


      Thanks!










      share|improve this question














      I have a component that displays a row in a grid-system simil-bootstrap. It is as simple as an image on the left and some body text on the right, both pulled dynamically from a CMS.



      I am trying to add a condition that would display the text first and then the image, or vice versa.
      ng-container and ng-template seems like the way to go, but I can't figure out how.



      I am looking for something like:



      <ng-container *ngIf="content.switched; then Image and Text; else Text and Image"></ng-container>

      <ng-template #Image> ... </ng-template>
      <ng-template #Text> ... </ng-template>


      Thanks!







      angular






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 25 '18 at 13:43









      TommazoTommazo

      82




      82
























          2 Answers
          2






          active

          oldest

          votes


















          0














          I guess the best way to do this is by using CSS Flexboxes (row vs row-reverse). If you cannot use Flexbox, or just want to to this using Angular, a suitable approach could be using the directive's or component's ViewContainerRef to add the templates in the desired order:



          @Component({
          ...
          })
          public class AnyComponent implements OnInit {
          @ViewChild('Image')
          public imageTemplate: TemplateRef<any;>
          @ViewChild('Text') // grabs a reference to the <ng-template #Text>
          public textTemplate: TemplateRef<any;>

          constructor(private viewContainer: ViewContainerRef) {}

          public ngOnInit(): void {
          if(condition) {
          this.viewContainer.createEmbeddedView(this.textTemplate);
          this.viewContainer.createEmbeddedView(this.imageTemplate);
          } else {
          this.viewContainer.createEmbeddedView(this.imageTemplate);
          this.viewContainer.createEmbeddedView(this.textTemplate);
          }

          }
          }





          share|improve this answer
























          • Thanks! I ended up using the css solution but the Angular one was also very helpful!

            – Tommazo
            Nov 26 '18 at 8:00



















          0














          It can be done with two ng-container elements, each one displaying a template with the ngTemplateOutlet directive and selecting the template with a conditional expression:



          <ng-container *ngTemplateOutlet="content.switched ? Image : Text"></ng-container>
          <ng-container *ngTemplateOutlet="content.switched ? Text : Image"></ng-container>

          <ng-template #Image>...</ng-template>
          <ng-template #Text>...</ng-template>


          See this stackblitz for a demo.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53468083%2fconditionally-swap-elements-position-in-a-row%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            I guess the best way to do this is by using CSS Flexboxes (row vs row-reverse). If you cannot use Flexbox, or just want to to this using Angular, a suitable approach could be using the directive's or component's ViewContainerRef to add the templates in the desired order:



            @Component({
            ...
            })
            public class AnyComponent implements OnInit {
            @ViewChild('Image')
            public imageTemplate: TemplateRef<any;>
            @ViewChild('Text') // grabs a reference to the <ng-template #Text>
            public textTemplate: TemplateRef<any;>

            constructor(private viewContainer: ViewContainerRef) {}

            public ngOnInit(): void {
            if(condition) {
            this.viewContainer.createEmbeddedView(this.textTemplate);
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            } else {
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            this.viewContainer.createEmbeddedView(this.textTemplate);
            }

            }
            }





            share|improve this answer
























            • Thanks! I ended up using the css solution but the Angular one was also very helpful!

              – Tommazo
              Nov 26 '18 at 8:00
















            0














            I guess the best way to do this is by using CSS Flexboxes (row vs row-reverse). If you cannot use Flexbox, or just want to to this using Angular, a suitable approach could be using the directive's or component's ViewContainerRef to add the templates in the desired order:



            @Component({
            ...
            })
            public class AnyComponent implements OnInit {
            @ViewChild('Image')
            public imageTemplate: TemplateRef<any;>
            @ViewChild('Text') // grabs a reference to the <ng-template #Text>
            public textTemplate: TemplateRef<any;>

            constructor(private viewContainer: ViewContainerRef) {}

            public ngOnInit(): void {
            if(condition) {
            this.viewContainer.createEmbeddedView(this.textTemplate);
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            } else {
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            this.viewContainer.createEmbeddedView(this.textTemplate);
            }

            }
            }





            share|improve this answer
























            • Thanks! I ended up using the css solution but the Angular one was also very helpful!

              – Tommazo
              Nov 26 '18 at 8:00














            0












            0








            0







            I guess the best way to do this is by using CSS Flexboxes (row vs row-reverse). If you cannot use Flexbox, or just want to to this using Angular, a suitable approach could be using the directive's or component's ViewContainerRef to add the templates in the desired order:



            @Component({
            ...
            })
            public class AnyComponent implements OnInit {
            @ViewChild('Image')
            public imageTemplate: TemplateRef<any;>
            @ViewChild('Text') // grabs a reference to the <ng-template #Text>
            public textTemplate: TemplateRef<any;>

            constructor(private viewContainer: ViewContainerRef) {}

            public ngOnInit(): void {
            if(condition) {
            this.viewContainer.createEmbeddedView(this.textTemplate);
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            } else {
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            this.viewContainer.createEmbeddedView(this.textTemplate);
            }

            }
            }





            share|improve this answer













            I guess the best way to do this is by using CSS Flexboxes (row vs row-reverse). If you cannot use Flexbox, or just want to to this using Angular, a suitable approach could be using the directive's or component's ViewContainerRef to add the templates in the desired order:



            @Component({
            ...
            })
            public class AnyComponent implements OnInit {
            @ViewChild('Image')
            public imageTemplate: TemplateRef<any;>
            @ViewChild('Text') // grabs a reference to the <ng-template #Text>
            public textTemplate: TemplateRef<any;>

            constructor(private viewContainer: ViewContainerRef) {}

            public ngOnInit(): void {
            if(condition) {
            this.viewContainer.createEmbeddedView(this.textTemplate);
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            } else {
            this.viewContainer.createEmbeddedView(this.imageTemplate);
            this.viewContainer.createEmbeddedView(this.textTemplate);
            }

            }
            }






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 25 '18 at 15:51









            A.WinnenA.Winnen

            9021110




            9021110













            • Thanks! I ended up using the css solution but the Angular one was also very helpful!

              – Tommazo
              Nov 26 '18 at 8:00



















            • Thanks! I ended up using the css solution but the Angular one was also very helpful!

              – Tommazo
              Nov 26 '18 at 8:00

















            Thanks! I ended up using the css solution but the Angular one was also very helpful!

            – Tommazo
            Nov 26 '18 at 8:00





            Thanks! I ended up using the css solution but the Angular one was also very helpful!

            – Tommazo
            Nov 26 '18 at 8:00













            0














            It can be done with two ng-container elements, each one displaying a template with the ngTemplateOutlet directive and selecting the template with a conditional expression:



            <ng-container *ngTemplateOutlet="content.switched ? Image : Text"></ng-container>
            <ng-container *ngTemplateOutlet="content.switched ? Text : Image"></ng-container>

            <ng-template #Image>...</ng-template>
            <ng-template #Text>...</ng-template>


            See this stackblitz for a demo.






            share|improve this answer




























              0














              It can be done with two ng-container elements, each one displaying a template with the ngTemplateOutlet directive and selecting the template with a conditional expression:



              <ng-container *ngTemplateOutlet="content.switched ? Image : Text"></ng-container>
              <ng-container *ngTemplateOutlet="content.switched ? Text : Image"></ng-container>

              <ng-template #Image>...</ng-template>
              <ng-template #Text>...</ng-template>


              See this stackblitz for a demo.






              share|improve this answer


























                0












                0








                0







                It can be done with two ng-container elements, each one displaying a template with the ngTemplateOutlet directive and selecting the template with a conditional expression:



                <ng-container *ngTemplateOutlet="content.switched ? Image : Text"></ng-container>
                <ng-container *ngTemplateOutlet="content.switched ? Text : Image"></ng-container>

                <ng-template #Image>...</ng-template>
                <ng-template #Text>...</ng-template>


                See this stackblitz for a demo.






                share|improve this answer













                It can be done with two ng-container elements, each one displaying a template with the ngTemplateOutlet directive and selecting the template with a conditional expression:



                <ng-container *ngTemplateOutlet="content.switched ? Image : Text"></ng-container>
                <ng-container *ngTemplateOutlet="content.switched ? Text : Image"></ng-container>

                <ng-template #Image>...</ng-template>
                <ng-template #Text>...</ng-template>


                See this stackblitz for a demo.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 25 '18 at 18:32









                ConnorsFanConnorsFan

                31.7k43263




                31.7k43263






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53468083%2fconditionally-swap-elements-position-in-a-row%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Wiesbaden

                    Marschland

                    Dieringhausen