0

[フィルター] を新しくクリックしても、以前の出力はクリアされませんが、存在するものに追加されます。たとえば、「禁止」でフィルタリングすると、禁止されたユーザーのリストが表示されます。次の「登録済み」によるフィルターでは、「禁止済み」は削除されず、「登録済み」がテーブルの最後に追加されます。コントローラーで $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 に答える