ng-repeat与动态ng-include和模板变量作用域问题

12 浏览
0 Comments

ng-repeat与动态ng-include和模板变量作用域问题

当ng-repeat在动态的ng-include中使用变量时,它无法正确地使用这些变量。

请参考这个plunker

主要的HTML代码:

学生 老师

profile.html代码:

编号 - {{profile.id}}
姓名 - {{profile.name}}

你可以在链接中看到,如果没有ng-include,它可以正常工作。

补充说明:这只是我实际尝试实现的原型。

主要问题在于ng-repeat中使用的变量在动态ng-include中无法正常工作。

我已经查看了类似的问题,但没有得到任何答案。

1 2 3

0
0 Comments

问题的原因是在ng-repeat中使用动态的ng-include和模板变量时,作用域出现了问题。解决方法是创建一个独立的html文件,将重复的代码提取出来,然后在ng-include中使用该文件。

具体解决方法如下:

首先,在index.html中创建一个tbody元素,并使用ng-repeat指令循环遍历data数组中的元素。在每次循环中,使用ng-include指令加载profile.html文件,并通过onLoad属性将当前循环项的student属性传递给profile变量。然后,再使用ng-include指令加载profile2.html文件,并通过onLoad属性将当前循环项的teacher属性传递给profile2变量。代码如下:


  
    
      

然后,在profile2.html文件中,显示profile2对象的id和name属性的值。代码如下:

Id - {{profile2.id}}
Name - {{profile2.name}}

这样,就可以避免重复维护两个具有相同内容的模板文件。通过提取重复的代码到独立的html文件中,并使用动态的ng-include和模板变量,可以实现在ng-repeat循环中加载不同的模板内容。

需要注意的是,这种方法适用于原型开发阶段,当模板内容较长时尤其适用。在实际开发中,可以根据具体需求选择使用动态加载模板的方法。

0
0 Comments

ng-repeat with dynamic ng-include and template variables scope issue的问题是在使用ng-repeat指令时,结合ng-include和模板变量时出现的作用域问题。当我们使用ng-repeat指令遍历数据,并在循环中使用ng-include指令和模板变量时,会导致作用域混乱的问题。

解决这个问题的方法是使用一个简单的profile指令,并通过隔离作用域将数据传递给它。

首先,我们需要在Angular应用中定义一个名为"ng-include-example"的模块,并在该模块中创建一个控制器"MainCtrl"。在控制器中,我们定义了一个包含学生和教师信息的数据数组。

接下来,我们创建了一个profile指令。该指令使用了restrict属性指定了指令的使用方式为元素,并使用了scope属性来创建一个隔离作用域。在隔离作用域中,我们使用了"="符号来将外部传递进来的数据赋值给指令内部的profile变量。最后,我们使用templateUrl属性指定了指令的模板文件为"profile.html"。

在HTML中,我们使用了profile指令来显示学生和教师的信息。我们通过ng-repeat指令遍历data数组,并将每个元素赋值给变量val。然后,在循环中,我们使用profile指令来显示学生和教师的信息。

通过以上的修改,我们成功解决了ng-repeat with dynamic ng-include and template variables scope issue的问题。现在,我们可以正确地显示学生和教师的信息,并且不会出现作用域混乱的情况。

完整代码如下:




  
  


  
Using Directive
Student Teacher

// profile.html
{{profile.name}} {{profile.id}}

通过以上的修改和整理,我们可以解决ng-repeat with dynamic ng-include and template variables scope issue的问题,并成功显示学生和教师的信息。

0
0 Comments

问题的出现的原因是ng-include指令在使用时不会创建一个新的$scope对象,而是继承它的原型,因此会覆盖之前的值。在代码中首先设置profile为theStudent,然后又将其覆盖为theTeacher,因此在两个模板中它始终被设置为theTeacher。

解决方法是通过添加ng-if="true"来创建一个新的$scope对象,这相当于一个小的“hack”:


    
        
            

这样可以解决问题。但是是否有其他方法可以避免使用这个“hack”呢?是的,可以参考我的答案。

0