我正在研究 Angular 作为即将到来的项目使用的潜在框架。我正在制作的测试应用程序包含一个无序列表,其中可以通过添加链接添加列表项。每个列表项都包含许多复选框。可以通过每个列表项旁边的加号和减号链接来增加或减少特定列表项的复选框数量。观察:
希望这是有道理的。每个复选框都有一个ng-model
指令,将复选框的值绑定到对象中的属性。当应用程序处于上述状态时,单击任何复选框会触发六个检查(每个复选框一个)- 检查整个$scope
根控制器是否有更改。理想情况下,只会$scope
检查相关列表项的更改。我怎样才能做到这一点?我附上了我的测试代码以供参考。我已经尝试添加ng-click="$event.stopPropagation()"
到input
节点以及li
节点,但这似乎会增加(加倍)摘要中的检查次数。
HTML:
<div ng-app ng-controller="App">
<ul>
<li ng-repeat="line in lines" ng-controller="LineController">
<input type="checkbox" ng-repeat="box in line.boxes" ng-model="box.on" />
<a ng-show="line.boxes.length > 1" ng-click="removeBox()">-</a>
<a ng-click="addBox()">+</a>
</li>
</ul>
<a ng-click="addLine()">Add</a>
</div>
JavaScript:
function App($scope) {
$scope.lines = [];
$scope.addLine = function () {
$scope.lines.push({
boxes: []
});
};
}
function LineController($scope) {
$scope.addBox = function () {
var box = {};
Object.defineProperty(box, 'on', {
enmerable: true,
get: function () {
console.log('Get!');
return this._on;
},
set: function (on) {
this._on = on;
}
});
$scope.line.boxes.push(box);
};
$scope.removeBox = function () {
$scope.line.boxes.pop();
};
}