【问题标题】:Output is concatenated输出连接
【发布时间】:2015-05-31 02:56:50
【问题描述】:

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

【问题讨论】:

    标签: angularjs meteor angular-meteor


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 关于 ngSelected - 完全删除它,但问题仍然存在。尝试使用输入类型文本,但仍然是同样的问题。抱歉,对 ng-model 不太了解,能否补充示例?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多