ng-repeat 范围的奇怪行为
Weird behavior of ng-repeat scope
我有这张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 服务
否则虽然设置了初始值但模型不会更新
正确。
- Ng-repeat 范围不使用 $parent 但它工作正常
这对我来说看起来不一致。我知道 ng-repeat 创建了一个子作用域,但为什么它不需要 $parent 呢?为什么 $parent 是必需的,尽管它在 ng-repeat 定义之外?
更新:
我发布的代码是 ng-switch 的一部分,所以我也放了它。 shownProducts 是一个数组,其中包含按搜索文本过滤的项目。我将该控件添加到 HTML。我还将产品数组添加到 $scope.
演示版 - 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>
问题是 ng-switch 创建了一个新的作用域,因此我必须使用 $parent 来访问声明所有内容的父作用域。
angularjs - ng-switch does not bind ng-model
我有这张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 服务 否则虽然设置了初始值但模型不会更新 正确。
- Ng-repeat 范围不使用 $parent 但它工作正常
这对我来说看起来不一致。我知道 ng-repeat 创建了一个子作用域,但为什么它不需要 $parent 呢?为什么 $parent 是必需的,尽管它在 ng-repeat 定义之外?
更新:
我发布的代码是 ng-switch 的一部分,所以我也放了它。 shownProducts 是一个数组,其中包含按搜索文本过滤的项目。我将该控件添加到 HTML。我还将产品数组添加到 $scope.
演示版 - 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>
问题是 ng-switch 创建了一个新的作用域,因此我必须使用 $parent 来访问声明所有内容的父作用域。
angularjs - ng-switch does not bind ng-model