4

ビューで次のグリッドが定義されています

<div class="gridStyle hide" ng-grid="resultsOptions" id="resultsGrid"></div>

また、ctrl キーが押された場合にのみ multiSelect を許可したいと考えています。したがって、コントローラーで multiSelect 属性を false として定義します。

$scope.resultsOptions = {
    data: 'searchData',
    selectedItems: $scope.mySelections,
    multiSelect: false,
    enableHighlighting: true,
    enableRowSelection: true
};

同じコントローラに、multiSelect を true に設定する次のコードがあります。

$("#resultsGrid").keydown(function (e) {
    if (e.ctrlKey) {
        $scope.resultsOptions.multiSelect = true;
        $scope.$apply();
    }
});

アプリケーションを起動すると、ctrl を押した後に multiSelect の値が変わります。しかし、私はまだ複数選択を行うことができません。

multiSelect に変数を使用しようとしましたが、何も変わりません。

次の例も multiSelect 属性を変更しません。ただし、グリッド ヘッダーが変更されます。 http://plnkr.co/edit/RwYSG4?p=preview

簡単な解決策はありますか?または、コードで何が欠けていますか?

4

2 に答える 2

6

beforeSelectionChange承認された「ハッキーな」回答は私たちにとって十分にクリーンではなかったため、厄介なキーバインディングを行う代わりに、イベントパラメーターに依存する、もう少し堅牢なバージョンを構築しました。これは、特定のカスタム CSS クラスまたは ID を参照する必要がなく、信頼できる ng-grid クラスを使用するだけなので、このイベント コールバックを追加する任意のグリッドでも機能します。

beforeSelectionChange: function(rowItem, event){
    if(!event.ctrlKey && !event.shiftKey && $scope.multiSelect && 
        !$(event.srcElement).is(".ngSelectionCheckbox"))
    {
          angular.forEach($scope.myData, function(data, index){
              $scope.gridOptions.selectRow(index, false);
          });
    }
    return true;
}

これが行うことは、複数選択操作 (Ctrl キー、Shift キー、または複数選択チェックボックスを使用) を行っているかどうかを単純にチェックすることです。そうであれば、複数選択を実行します。ユーザーが行の他の場所をクリックしただけで、複数選択がアクティブな場合は、現在の選択をすべて削除して、後で 1 つのターゲット行だけが選択されるようにします。

于 2014-01-16T10:00:55.460 に答える
4

一部のグリッド オプションをその場で変更することは不可能であるため ( https://github.com/angular-ui/ng-grid/issues/386 )。グリッドのbeforeSelectionChange属性でctrl が押されていない場合は、すべての要素を手動で選択解除することにしました。

解決策は面倒ですが、うまくいきます。

マビのコメントに基づいて...

于 2013-10-11T12:34:16.793 に答える