7

ユーザーに通知メッセージを表示するために使用されるディレクティブを作成しました。通知を表示するために、私はこれを書きました:

$scope.$watch($messaging.isUpdated, function() {
    $scope.messages = $messaging.getMessages();
    if ($scope.messages.length > 0) {
        $timeout(function() {
            for (var i = 0; i < $scope.messages.length; i++) {
                if (i + 1 < $scope.messages.length) {
                    $messaging.removeMessage($scope.messages[i]);
                } else {
                    $messaging.removeMessage($scope.messages[i]);
                }
            }
        }, 5000);
    }
});

$timeout を使用して、メッセージが画面に 5 秒間表示されるようにしています。

ここで、通知が確実に表示されるように、End-To-End テストを書きたいと思います。問題は、通知が表示されるときに、通知メッセージと同じようにエンドツーエンドもタイムアウトになることです。これにより、正しい通知が表示されているかどうかを確認できなくなります。.

これは私のテストコードです:

it('submit update Center', function() {
    input('center.Name').enter('New Name');
    input('center.Department').enter('New Department');
    input('center.Contact').enter('New contact');
    input('center.Street').enter('New street');
    input('center.City').enter('New city');
    input('center.Country').enter('New Country');
    element('button#center_button').click();

    expect(element('.feedback').count()).toBe(1);
    expect(element('.feedback:first').attr('class')).toMatch(/success/);

    expect(element('.error.tooltip').count()).toBe(0);
});

javascript setTimeout() の使用を避け、この問題に対する別の (Angular) ソリューションがあることを願っています。

4

2 に答える 2

11

悪い知らせだ、友よ。これは AngularJs の既知の問題です。ここで議論があり、「何らかの形で関連する」問題がここにあります。

幸いなことに、独自の$timeoutサービスをロールアップし、手動で呼び出しsetTimeoutて呼び出すことで、これを回避できます$apply(これは、私が参照したディスカッションからの提案です)。それは本当に醜いですが、それは本当に簡単です。簡単な例:

app.service('myTimeout', function($rootScope) {
  return function(fn, delay) {
    return setTimeout(function() {
      fn();
      $rootScope.$apply();
    }, delay);
  };
});

これは Angular$timeoutと互換性がないことに注意してください。ただし、必要に応じて機能を拡張できます。

于 2013-04-21T14:42:50.490 に答える