【问题标题】:Weird behavior of ng-repeat scopeng-repeat 范围的奇怪行为
【发布时间】:2015-05-30 09:05:48
【问题描述】:

我有这段 HTML:

<div ng-switch="view">
    <div ng-switch-when="products">
        <input class="form-control" placeholder="Search" ng-model="searchText" />
        <ul ng-show="products && products.length > 0">
            <li class="head">
                <div class="column col-select"><input type="checkbox" ng-model="$parent.allSelected" ng-change="$parent.selectAll($parent.allSelected)" /></div>
                <div class="column col-name">Name</div>
                <div class="column col-code">Code</div>
                <div class="column col-stock">Stock</div>
                <div class="column col-code">Price</div>
                <div class="column col-buttons"></div>
            </li>
            <li ng-repeat="p in ($parent.shownProducts = (products | filter: searchText))">
                <div class="column col-select"><input type="checkbox" ng-model="p.selected" ng-change="select(p.selected)" /></div>
                <div class="column col-name">{{ p.name }}</div>
                <div class="column col-code">{{ p.code }}</div>
                <div class="column col-stock">{{ p.stock }}</div>
                <div class="column col-code">{{ p.price | currency: '$' : 2 }}</div>
                <div class="column col-buttons">
                    <button class="btn btn-edit" ng-click="goTo('edit', $index)"><i class="fa fa-pencil"></i></button>
                    <button class="btn btn-delete" ng-click="goTo('delete', $index)"><i class="fa fa-trash"></i></button>
                </div>
            </li>
        </ul>
    </div>
</div>

在我的 Angular 控制器中:

$scope.products = [{ name: 'Test1' }, { name: 'Test2' }];

$scope.select = function (value) {
    if (!value) {
        $scope.allSelected = value;
        return;
    }

    var selCount = 0;
    for (var i in $scope.shownProducts) {
        if ($scope.shownProducts[i].selected) selCount++;
    }

    if (selCount == $scope.shownProducts.length) $scope.allSelected = true;
};

$scope.selectAll = function (value) {
    for (var i in $scope.shownProducts) {
        $scope.shownProducts[i].selected = value;
    }
};

这段代码可以工作,但是:

  • Header (li.head) 必须使用 $parent scope 才能访问 $scope 服务 否则,尽管设置了初始值,但模型并未更新 正确。
  • Ng-repeat 范围不使用 $parent 但它工作正常

对我来说看起来不一致。我知道 ng-repeat 创建了一个子范围,但为什么它不需要 $parent 呢?为什么需要 $parent 虽然它在 ng-repeat 定义之外?

更新:

我发布的代码是 ng-switch 的一部分,所以我也把它放了。 shownProducts 是一个数组,其中包含按搜索文本过滤的项目。我将该控件添加到 HTML。我还在 $scope 中添加了一系列产品。

【问题讨论】:

    标签: javascript angularjs angularjs-ng-repeat ng-repeat


    【解决方案1】:

    演示 - http://plnkr.co/edit/0TpaUYqgaWYlGTdQ2KJN?p=preview

    JS

    $scope.select = function (value) {
        if (!value) {
            $scope.allSelected = value;
            return;
        }
    
        var selCount = 0;
        for (var i in $scope.shownProducts) {
            if ($scope.shownProducts[i].selected) selCount++;
        }
    
        if (selCount == $scope.shownProducts.length) $scope.allSelected = true;
      };
    
      $scope.selectAll = function (value) {
          for (var i in $scope.shownProducts) {
              $scope.shownProducts[i].selected = value;
          }
      };
    
      $scope.products = [{"name":1, "code":"001","stock":"abc","price":500},{"name":2, "code":"002","stock":"xyz","price":1000}];
      $scope.shownProducts = $scope.products;
    

    HTML

    无需使用$parent。删除它,一切正常。

    <ul ng-show="products && products.length > 0">
      <li class="head">
          <div class="column col-select"><input type="checkbox" ng-model="allSelected" ng-change="selectAll(allSelected)" /></div>
          <div class="column col-name">Name</div>
          <div class="column col-code">Code</div>
          <div class="column col-stock">Stock</div>
          <div class="column col-code">Price</div>
          <div class="column col-buttons"></div>
      </li>
      <li ng-repeat="p in shownProducts = (products | filter: searchText)">
          <div class="column col-select"><input type="checkbox" ng-model="p.selected" ng-change="select(p.selected)" /></div>
          <div class="column col-name">{{ p.name }}</div>
          <div class="column col-code">{{ p.code }}</div>
          <div class="column col-stock">{{ p.stock }}</div>
          <div class="column col-code">{{ p.price | currency: '$' : 2 }}</div>
          <div class="column col-buttons">
              <button class="btn btn-edit" ng-click="goTo('edit', $index)"><i class="fa fa-pencil"></i></button>
              <button class="btn btn-delete" ng-click="goTo('delete', $index)"><i class="fa fa-trash"></i></button>
          </div>
      </li>
    </ul>
    

    【讨论】:

    • 至少添加一些关于您的代码如何解决 OP 问题的说明。
    • 谢谢,但我刚刚意识到问题是我最初没有指定的 ng-switch。我发布了更新。
    【解决方案2】:

    问题是 ng-switch 创建了一个新范围,因此我必须使用 $parent 来访问声明所有内容的父范围。

    angularjs - ng-switch does not bind ng-model

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多