我们可以将ng-controller和ng-repeat附加到同一个DOM元素吗? Fiddle
这是HTML:
<table>
<tbody ng-controller="UserController" ng-repeat="user in users" ng-click="toggleSelectedUser()" ng-switch on="isSelectedUser()">
<tr>
<td>{{user.name}}</td>
<td>{{user.email}}</td>
</tr>
<tr ng-switch-when="true">
<td colspan="2">
{{user.desc}}
</td>
</tr>
</tbody>
</table>
以下是代码:
angular.module("myApp", [])
.controller("UserController", ["$scope", function($scope) {
$scope.users = [
{name : "Anup Vasudeva", email : "anup.vasudeva2009@gmail.com", desc : "Description about Anup Vasudeva"},
{name : "Amit Vasudeva", email : "amit.vasudeva2009@gmail.com", desc : "Description about Amit Vasudeva"},
{name : "Vijay Kumar", email : "vijay.kumar@gmail.com", desc : "Description about Vijay Kumar"}
];
$scope.selected = false;
$scope.toggleSelectedUser = function() {
$scope.selected = !$scope.selected;
};
$scope.isSelectedUser = function() {
return $scope.selected;
};
}]);
我认为将ng-controller
和ng-repeat
绑定到同一个DOM元素是有意义的。 ng-repeat创建的范围可由控制器管理。我想要的是变量selected
对每个范围都应该是唯一的。
答案 0 :(得分:11)
您应该将控制器分为UserListController
和UserController
。用户列表应该是UserListController的一部分,每个项目都可以由UserController
像
这样的东西<table ng-controller='UserListController'>
<tbody ng-controller="UserController" ng-repeat="user in users" ng-click="toggleSelectedUser()" ng-switch on="isSelectedUser()" ng-init="user=user">
因此用户控制器变为
angular.module("myApp", [])
.controller("UserController", ["$scope", function($scope) {
$scope.selected = false;
$scope.toggleSelectedUser = function() {
$scope.user.selected = !$scope.selected;
};
$scope.isSelectedUser = function() {
return $scope.user.selected;
};
}]);
答案 1 :(得分:1)
我想要的是所选的变量对于每个范围都应该是唯一的。
是的,你可以。
您可以创建根控制器mainController
并为每个用户添加模型users
新控制器。
之后,将ng-repeat中的新控制器调用为ng-controller="user.ctrl"
演示 Fiddle
我会写一些类似的东西:
<强> HTML 强>
<div ng-controller="mainController">
<table>
<tbody ng-repeat="user in users" ng-controller="user.ctrl" ng-click="toggleSelectedUser()" ng-switch on="isSelectedUser()">
<tr>
<td>{{user.name}}</td>
<td>{{user.email}}</td>
</tr>
<tr ng-switch-when="true">
<td colspan="2" style="padding-left: 10px">{{user.desc}}</td>
</tr>
</tbody>
</table>
</div>
<强> JS 强>
var fessmodule = angular.module('myModule', []);
fessmodule.controller('mainController', function ($scope) {
$scope.users = [{
ctrl: fooCtrlA,
name: "AAAAA",
email: "a2009@gmail.com",
desc: "Description about AAAA"
}, {
ctrl: fooCtrlB,
name: "BBBBB",
email: "b2009@gmail.com",
desc: "Description about BBBBB"
}, {
ctrl: fooCtrlC,
name: "CCCCC",
email: "c2009@gmail.com",
desc: "Description about CCCC"
}];
});
fessmodule.$inject = ['$scope'];
function fooCtrlA($scope) {
$scope.selected = true;
$scope.toggleSelectedUser = function () {
$scope.selected = !$scope.selected;
};
$scope.isSelectedUser = function () {
return $scope.selected;
};
}
function fooCtrlB($scope) {
$scope.selected = false;
$scope.toggleSelectedUser = function () {
$scope.selected = !$scope.selected;
};
$scope.isSelectedUser = function () {
return $scope.selected;
};
}
function fooCtrlC($scope) {
$scope.selected = false;
$scope.toggleSelectedUser = function () {
$scope.selected = !$scope.selected;
};
$scope.isSelectedUser = function () {
return $scope.selected;
};
}
但是你可以看到我们有代码重复!! 。每个“子”控制器都具有相同的逻辑:
$scope.selected = false;
$scope.toggleSelectedUser = function () {
$scope.selected = !$scope.selected;
};
$scope.isSelectedUser = function () {
return $scope.selected;
};
如果您想让代码正常工作,我会使用ng-model
。
演示2 Fiddle
<强> HTML 强>
<tbody ng-repeat="user in users" ng-click="toggleSelectedUser(user)" ng-switch on="isSelectedUser(user)">
<tr ng-model="user">
<td>{{user.name}}</td>
<td>{{user.email}}</td>
</tr>
<tr ng-switch-when="true">
<td colspan="2" style="padding-left: 10px">{{user.desc}}</td>
</tr>
</tbody>
和已修改模型的控制器:
var fessmodule = angular.module('myModule', []);
fessmodule.controller('mainController', function ($scope) {
$scope.users = [{
selected: false,
name: "AAAAA",
email: "a2009@gmail.com",
desc: "Description about AAAA"
}, {
selected: false,
name: "BBBBB",
email: "b2009@gmail.com",
desc: "Description about BBBBB"
}, {
selected: false,
name: "CCCCC",
email: "c2009@gmail.com",
desc: "Description about CCCC"
}];
$scope.toggleSelectedUser = function (user) {
user.selected = !user.selected;
};
$scope.isSelectedUser = function (user) {
return user.selected;
};
});