Angular JS ng-include绑定问题

6
我使用模板文件创建了一个分页小部件,并在我的HTML页面中使用了两次。我有一个用于跳转到页面选项的选择框,以及上一页和下一页的链接。
问题在于,当我使用选择框更新当前页面并使用上一页和下一页链接时,当前页面会被更新,但选择框不会被更新。
请告诉我我做错了什么。我在构建这样的分页小部件时是否存在任何逻辑错误?
控制器代码:
 var gallery = angular.module('gallery', []);
    gallery.controller('ItemListCtrl', ['$scope', function($scope){
      /*  Pagination Code */
    $scope.currentPage = 1;
    $scope.itemsPerPage = 24;
    $scope.total = 100;
    $scope.range = function(min, max, step){
      step = step || 1;
      var input = [];
      for (var i = min; i <= max; i += step) input.push(i);
      return input;
    };
    $scope.prevPage = function (){
      if($scope.currentPage > 1){
        $scope.currentPage--;
      }
    };
    $scope.nextPage = function (){
      if($scope.currentPage < $scope.pageCount()){
        $scope.currentPage++;
      }
    };
    $scope.pageCount = function (){
      return Math.ceil($scope.total / $scope.itemsPerPage);
    };
    $scope.setPage = function (n){
      if(n >= 0 && n <= $scope.pageCount()){
        $scope.currentPage = parseInt(n, 10);
      }
    };
  }]);

这是用于重现问题的plnkr URL链接。

http://plnkr.co/edit/9LUJnVzWAS9BauyORQn5?p=preview

1个回答

12

根本原因是ng-include会为目标元素创建一个单独的作用域,因此您的代码的快速修复方法是将$parent前缀添加到所有作用域对象中。

<fieldset class="pager">
<div>Page {{$parent.currentPage}} of {{$parent.pageCount()}}</div>
<div>
<div>
<label>Go to page</label>
<select ng-model='$parent.currentPage' ng-change="$parent.setPage($parent.currentPage)">
<option ng-repeat="n in range(1,$parent.pageCount())" value="{{n}}" ng-selected="n === $parent.currentPage">{{n}}</option>
</select>
</div>
<div>
<a href ng-click="$parent.prevPage()">Previous Page</a>
&nbsp;|&nbsp; 
<a href ng-click="$parent.nextPage()">Next Page</a>
</div>
</div>
</fieldset>

根据 Angular 文档 《理解作用域》,当您尝试将 2-way 数据绑定(即表单元素、ng-model)到原始类型时,作用域继承不会按照您的预期工作。避免这个原始类型问题的最佳做法是始终在 ng-models 中加入“.”。请参考此视频

我已经阅读过,添加 $parent 有点像是一种 hack。如果你能告诉我用 Angular 创建这样一个小部件的方式,那将非常有帮助。 - Abdul Haseeb
4
Angular 处理作用域继承的方式是在 ng-model 中使用 .,例如 $scope.info = { currentPage: 1, itemsPerPage : 24, total : 100},然后在视图中通过 info.currentpageinfo.itemsPerPage 访问它们。 - Rebornix
+1。非常感谢。我已经忙碌了将近3个小时,但是一直想不通。使用$parent解决了我的所有问题。 - Amarnath
@Che $parent可以是一个解决方法,但最好使用a.b点符号表示法来解决这个问题。 - Rebornix
我最终将ng-include删除了,因为我的包含太多元素了,如果要回去使用dot或$parent来管理它们太麻烦了……我只是用它使HTML更容易理解。这次真是谢谢你了。 - iTrout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接