0

新单击 [Filter] 不会清除以前的输出,但添加到存在。例如,如果按“禁止”过滤,我看到禁止用户列表,下一个按“注册”过滤不会删除“禁止”,而是将“注册”添加到表的末尾。在控制器 $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);
});
4

2 回答 2

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

于 2015-05-30T18:56:50.843 回答
0

我认为您的问题是, ngSelected 不一定只选择您的下拉列表中的一个选项。那是因为,从技术上讲,您应该像在官方文档中那样手动取消选择不需要的 userStatus :

https://docs.angularjs.org/api/ng/directive/ngSelected

您可以尝试将您的 ng-model (userState) 发送到 filter() 函数,并直接使用该值进行过滤,而无需检查范围。

于 2015-05-29T15:22:02.247 回答