新点击[过滤器]不会清除以前的输出,但会添加到存在。 例如,如果通过“禁止”过滤我看到禁止的用户列表,则“已注册”的下一个过滤器不会删除“禁止”,而是将“已注册”添加到表的末尾。 在控制器$ scope.site_users中覆盖,但在某处它仍然保存以前的过滤器输出。 为什么会这样?可能是包装方面的东西?
已安装的软件包:
urigo:angular - Angular
angularui:angular-ui-router
accounts-password
accounts-ui
twbs:bootstrap
删除了包
insecure
autopublish
或代码
控制器:
angular.module("sis_admin_am").controller("UsersListCtrl", ['$scope', '$meteor',
function($scope, $meteor){
$scope.filter = function(){
$scope.site_users = '';
$scope.site_users = $meteor.collection(Users).subscribe('site_users_filtered', {status: $scope.userStatus});
};
}
]);
查看:
<form ng-submit="filter()">
<button>Filter</button>
<select ng-model="userStatus" >
<option ng-selected="selected">banned</option>
<option>registered</option>
<option>active</option>
</select>
</form>
<p></p>
<table class="table">
<tr class="panel panel-default">
<th>Name</th>
<th>Email</th>
</tr>
<tr ng-repeat="user in site_users">
<td>{{ user.username }}</td>
<td>{{ user.email }}</td>
</tr>
</table>
服务器部分:
Meteor.publish('site_users_filtered', function(options) {
console.log('options:', options);
return Users.find(options);
});
答案 0 :(得分:1)
那是因为Meteor中的订阅如何运作。 如果您在不关闭之前添加或更改订阅,它只会将它们全部加在一起(这很好,但您必须注意它)。 如果您想使用订阅进行过滤(出于安全考虑),您应该更改代码:
angular.module("sis_admin_am").controller("UsersListCtrl", ['$scope', '$meteor',
function($scope, $meteor){
var savedSubscriptionHandle = null;
$scope.filter = function(){
savedSubscriptionHandle.stop();
$scope.site_users = '';
$scope.site_users = $meteor.collection(Users);
$scope.$meteorSubscribe('site_users_filtered', {status: $scope.userStatus}).then(function(handle){
savedSubscriptionHandle = handle;
});
};
}
]);
但如果您不介意将所有数据保存在本地缓存中,则可能更容易使用Angular的过滤器或Meteor的游标语法来过滤显示。
这里有更详细的解释: http://angular-meteor.com/tutorial/step_12
答案 1 :(得分:0)
我认为你的问题是,ngSelected并非必须只选择你的一个选择。 这是因为,技术上你应该像在官方文档中那样手动取消选择你不需要的用户状态:
https://docs.angularjs.org/api/ng/directive/ngSelected
您可以尝试将ng-model(userState)发送到filter()函数,并直接使用该值进行过滤,而无需检查范围。