When you push an object into an array it pushes the object by reference. Each time you call this
$scope.addPerson = function () {
$scope.object.push($scope.newEntry);
};
You are basically pushing the same object at different index positions of the array. Now this same object is repeated over in the repeater.
And when you toggle :
$scope.togglePerson = function (index) {
console.log(index); // Index is being passed properly
$scope.object[index].visible = !$scope.object[index].visible;
};
you are basically setting the same objects property on all the array indexes, since the array has the same object at all the indexes.
You need to do a copy of the object before pushing it into the array so that you get a new object every single time.
$scope.addPerson = function () {
$scope.object.push(angular.copy($scope.newEntry));
};
Here is a fiddle that demonstrates this :
NOTE : This has nothing to do with array track by $index