0

いくつかのフィルタリングを使用して、AngularUI でイベント カレンダーを作成しています。

<div
    id="calendar"
    ui-calendar="{ height: 450, editable: false, defaultView: 'month' }" 
    class="span9 pull-right calendar"
    ng-model="events"
</div>

フィルター ドロップダウンが変更されると、関数が起動され、ブードゥーを実行して $scope.events を更新する必要があります。

(短縮)

// Clear $scope.events
$scope.events = [];

// Initialise new events
var new_events = all_events;

if($scope.events_filter.type != 'all') {

    // Do filter
    new_events = json_service.filter(
        new_events,
        'type',
        $scope.events_filter.type
    );
}

// Update $scope.events
$scope.events = new_events;

まずは6つのイベントから。たとえば、2 つの「タイプ」があり、それぞれに 3 つのイベントがあり、1 つのタイプ A と 1 つのタイプ B を呼び出すと、すべてから A に変更でき、3 つのイベントが正しく表示されます。「すべて」に戻すと、6 つ表示されます。

A から B に変更すると、カレンダーは更新されませんが、$scope.events を調べると、データが変更されたことが示されます。

フィルタリングが機能し、$scope.events が更新されています。

問題は、 $scope.events の長さが変わらない場合、カレンダーを再描画するのに適していないと思われることです。

4

2 に答える 2

3

あなたは正しいです。イベント配列の長さが変わらない場合、カレンダーは更新されません。これは、angular が (ダイジェスト エラーをスローすることなく) 配列オブジェクト全体の変更を検出しないためです。むしろ、より焦点を絞った変数セットを監視するか、1 つのイベント ソースを返す関数を監視して、適切に動作する必要があります。

2 つの編集により、この特定の問題が解決されました。ウォッチ メソッドの値に getOptions() を追加し、最初のイベント ソースを監視するか、すべてのイベント ソースを監視し、ディレクティブの属性に equalsTracker を追加します。

これは、フィルター サービスから 2 つのイベントの配列を切り替えるカレンダーへのリンクです。(ただし、これで問題は解決しません) http://plnkr.co/edit/VbYDNK?p=preview

カレンダーは、eventSources の最初のイベント配列を監視しています。これで、スコープで angular を使用して制御したいイベントを最初の配列に追加できるようになりました。次に、ソースを取得する必要がある場合は、いつでも fullcalendar の addSource メソッドまたは選択した他のメソッドを呼び出すことができます。

これは、多くの攻撃の角度を作成する、はるかにオープンエンドのカレンダーです。

これは、長さではなく最初の配列自体を監視しているカレンダーへのリンクです。これも機能するので、これを使用する必要があるかもしれません。(これで問題は解決します) http://plnkr.co/edit/AU6KNZ?p=preview

大きな配列を監視するとパフォーマンスの問題が発生する可能性があることを読みました。

編集:私は製図板に戻って、これらすべての問題を 1 つで解決する方法を見つけました。これで、イベント ソースの最初の配列を監視する必要がなくなり、トラッカー変数を監視するだけで済みます。トラッカー変数は、eventSources 内のすべてのイベントの長さと eventSources 自体の長さを監視します。これにより、任意の配列を eventSources 内で監視できるようになり、angular がその魔法を実行できるようになります。

この特定の使用例のために、equalsTracker 属性がカレンダーに追加されました。この equalsTracker 属性は数値である必要があり、フィルター サービスが実行され、結果のイベントの配列がフィルター処理されている現在の scope.events 配列と同じ長さになるときに更新する必要があります。

于 2013-01-30T14:34:16.157 に答える
0

私は解決策を見つけました!joshkurzの助けを借りて、私はそれが長さの変化をチェックしているだけであることに気づきました。

簡単な解決策:-

フィルタリングする前に、$scope.eventsの長さを確認してください。

$scope.eventsのチェック長をフィルタリングした後。

var length = $scope.events.length;
$scope.events = [];
var new_events = all_events;

... filter new_events a little bit ...

$scope.events = new_events;

if($scope.events.length == length) {
    $scope.events.push({});
}

長さはもう変わりません;)

ありがとうジョシュ:)

于 2013-01-30T15:36:46.397 に答える