Problematic situation when using ng-repeat with dynamic ng-include and template variables scope conflict

When utilizing ng-repeat with dynamic ng-include that includes variables, the variables are not being properly recognized.

Take a look at this code snippet.

Here is the main HTML code:

<table style>
  <tr>
    <th>Student</th>
    <th>Teacher</th>
  </tr>
  <tbody ng-repeat="val in data">
    <tr>
      <td>
        <div ng-include src="'profile.html'" onLoad="profile=val.student"></div>
      </td>
      <td>
        <div ng-include src="'profile.html'" onLoad="profile=val.teacher"></div>
      </td>
    </tr>
  </tbody>
</table>

And here is the profile.html code:

<span>Id - {{profile.id}}</span>
<span>Name - {{profile.name}}</span>

Without using ng-include, everything works perfectly fine.

P.S. This is just a prototype of my desired functionality. I am specifically struggling with getting variables to work in dynamic ng-include within ng-repeat.

I have reviewed similar questions like these ones but haven't found any solutions:

1 2 3

Answer №1

When using the ng-include directive, it's important to note that it does not create a new $scope object. Instead, it prototypically inherits from the existing one, which can lead to unintentional overwriting of values. In this case, if you set profile=theStudent and then overwrite it with profile=theTeacher, the profile will always be set to the teacher in both templates.

To work around this issue, you can use a little 'hack' by adding the ng-if="true" attribute, which forces the creation of a new $scope object:

<tbody ng-repeat="val in data">
    <tr>
        <td>
            <div ng-include src="'profile.html'"
                 onLoad="profile=val.student"
                 ng-if="true"></div>
        </td>
        <td>
            <div ng-include src="'profile.html'" 
                 onLoad="profile=val.teacher"
                 ng-if="true"></div>
        </td>
    </tr>
</tbody>

For an updated example, you can refer to this plunker

Answer №2

Instead of using both ng-include and ng-if directives to achieve the desired outcome, a simpler approach is to create a custom profile directive with an isolated scope and pass data into it.

Plunker demo

angular.module('ng-include-example', []).
controller("MainCtrl", function($scope) {

  var data = [
       {
         "student" : { "id":11, "name": "John" },
         "teacher" : { "id" : 21, "name": "Mike"}
       },
       {
         "student" : { "id":12, "name": "Tony" },
         "teacher" : { "id" : 22, "name": "Jack"}
       },
       {
         "student" : { "id":13, "name": "Cris" },
         "teacher" : { "id" : 23, "name": "Anthony"}
       },
       {
         "student" : { "id":14, "name": "Greg" },
         "teacher" : { "id" : 24, "name": "Reva"}
       }

    ];

    $scope.data = data;

})
.directive("profile", function(){
  return{
    restrict:'E',
    scope:{
      profile: "="
    },
    templateUrl: "profile.html"
  }
});

<div>
  Using Directive
  <table style>
      <tr>
        <th>Student</th>
        <th>Teacher</th>
      </tr>
      <tbody ng-repeat="val in data">
        <tr>
          <td>
            <profile profile = "val.student"></profile>
          </td>
          <td>
            <profile profile = "val.teacher"></profile>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

Answer №3

To improve your coding experience, consider creating a separate HTML file named profile.html and then incorporate it into your code as shown below:

index.html

<tbody ng-repeat="val in data">
        <tr>
          <td>
            <div ng-include src="'profile.html'" onLoad="profile=val.student"></div>
          </td>
          <td>
            <div ng-include src="'profile2.html'" onLoad="profile2=val.teacher"></div>
          </td>
        </tr>
      </tbody>

profile2.html

<span>ID - {{profile2.id}}</span>
<span>Full Name - {{profile2.name}}</span>

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

What steps can be taken to seek assistance for a specific function within a module while using the REPL in node.js?

Seeking Documentation in the form of Man pages for a function within a module in node.js using REPL. When using Console.dir(modObj), all the methods and properties associated with a module are listed. However, I am unable to locate any manual or help docu ...

Issue with MiniCssExtractPlugin during compilation of the entry point build

We have integrated webpack into our deployment process to bundle resources efficiently. However, we are now facing a challenge as we aim to include the bundling of sass files through webpack in order to streamline our build process. The MiniCssExtractPlugi ...

Send data containing special characters through a GET request in PHP

I am looking for a way to send any text as a GET parameter to a PHP script. Currently, I am simply appending the text like this: action.php?text=Hello+my+name+is+bob This URL is generated using JavaScript and then used in an AJAX request. In action.php, ...

Employing jQuery Mobile with MVC3 for seamless auto-submit functionality

When I remove jQuery Mobile, the code works perfectly! The form: @using (Html.BeginForm("SearchTown", "Home", FormMethod.Post, new { id = "TheForm1" })) { @Html.DropDownList("TownID", (SelectList)ViewBag.TownId, "Select a Town") } The Javascript: & ...

Generating an interactive table using JSON data in ReactJS

I am a beginner in both React and UI development, and I would like to know how I can create a visually appealing table using the JSON data received from an AJAX call to the server. Any guidance or information on this topic would be greatly appreciated. v ...

Is there a way to retrieve the ID value instead of the displayValue from md-autocomplete in my servlet?

For the past two weeks, I've been deep into learning angularjs. However, I've hit a technical roadblock with a seemingly simple issue that has me stumped. I'm trying to implement md-autocomplete in my project, but I can't seem to retrie ...

Once an element is removed from ng-repeat, it does not provide the capability to remove or conceal the element from

The following code is used to display records using ng-repeat: <div class="gallery"> <div ng-cloak ng-repeat="photo in photos| orderBy:'-id'" ng-mouseLeave = "delete_btn = !delete_btn" ng-m ...

Is there a way to dynamically assign column names during the import process?

In my current scenario, I am importing data from various sources into my JSON backend. The mapping file will resemble the sample below. The question is how can I efficiently utilize this mapping during data import into my backend. The idea is to provide t ...

Ways to prevent a timeout when the score exceeds 1000

Could someone help me with clearing the interval and resetting the score in my code? It seems to be working fine, but when the score goes over 1000 and I hit reset, it doesn’t reset completely. I've tried placing the clearTimeout functions before e ...

SonarQube flagging a suggestion to "eliminate this unnecessary assignment to a local variable"

Why am I encountering an error with SonarQube? How can I resolve it since the rule page does not offer a specific solution? The suggestion is to eliminate the unnecessary assignment to the local variable "validateAddressRequest". validateAddress() { ...

Exploring File Read and Write Functionality in Angular 4

I want to develop an offline Task List in Angular 4. However, I am facing difficulty in finding a method to save data in a file on the client side using JavaScript or Angular. My current approach involves using browser's localStorage, but it is slow ...

update the dropdown values in the database by submitting the form

Members sign up for the website. The administrator will log in and access a list of users. I am attempting to provide an option for the admin to select a checkbox and update the user's status through a dropdown menu submission. When I tested the code ...

The ng-model failed to display the updated value until a click was made somewhere on the page

I am struggling with displaying the correct value of an ngModel variable defined in my controller. Despite changing to the correct value in the console, it doesn't update on the page until I click somewhere else or hit the update button again. Here&a ...

Querying the jQuery-Plugin to interact with AngularJS service methods

How to incorporate a JavaScript file into multiple Jquery plugins for accessing functions from JavaScript startTransactionController.js var app = angular.module('myApp'); app.controller('startTransactionCtrl', [ '$scope', ...

nested dropdowns in Bootstrap 4

I'm currently working on a nested dropdown menu feature. Although I have successfully implemented the functionality to display the next level, I am facing an issue where it does not close upon clicking. Check out my code here! Here is the JavaScript ...

What are some ways to conceal methods within a class so that they are not accessible outside of the constructor

I am a newcomer to classes and I have written the following code: class BoardTypeResponse { created_on: string; name: string; threads: string[]; updated_on: string; _id: string; delete_password: string; loading: BoardLoadingType; error: Bo ...

Angular Compilation Blocked Due to Circular Dependency Error

Currently, I am utilizing WebStorm as my IDE to work on a personal project that I envision turning into a game in the future. The primary goal of this project is to create an Alpha version that I can showcase to potential employers, as I am actively seekin ...

Add a fresh record only if it contains information and there are no existing duplicates present

Is it possible to create a note with both a title and text, under certain conditions? The title must not be empty The title cannot already exist in the system When attempting to check for duplicates within my array, the boolean value always returns true ...

Using local variables from an external HTML file within an AngularJS directive template

Just making sure I am wording my question correctly, but I have not been able to find any information on this specific topic. Imagine I have an AngularJS directive that looks something like this: angular.module( 'example', [] ).directive( ...

Discovering the Vertical Dimension of a Web Page Displayed in a Window

Working with an ASP.NET Site that utilizes a single Master Page, I am facing a challenge on one of the pages where I display a PDF file as the main content. I am looking for a solution to determine the appropriate size for the PDF control so that it fits ...