3

angularjsで「@ユーザー機能」を実装しようとしていますが、ユニットテストを書くことを除いて、機能をほぼ完成させています。テキストエリアでキャレットの位置を取得するのに役立つキャレットモジュールがあります。

最も重要なことはキャレットの位置を取得することだと思いますが、ジャスミンでそれを行う方法がわかりません。

マイディレクティブ

.directive('atUser', function (Caret) {
    return {
        restrict: 'A',
        link: function (scope, element) {
            element.bind('focus click keydown', function () {
                scope.caretPos = Caret.getPos(element);
            });

            scope.$watch(function () {
                return scope.caretPos;
            }, function (nowCaretPos) {
                /* do something here */
            })
        }
    }
})

HTML

<textarea ng-model="message" at-user></textarea>

ジャスミン

describe('test at user', function () {
    /* some init code */
    it('should get caret postion', function () {
        textarea = element.find('textarea');
        textarea.triggerHandler('focus');
        except(textarea.scope().caretPos).toEqual(0);

        /*
         * then i want to simulate keydown event and type something
         * and get the caret postion
         * but i dont know how to do it
         * /
    })
})

もう1つは、jqueryを使いたくないということです。

誰でも私を助けることができますか?

どうもありがとう!

4

1 に答える 1

1

textareaJasmine テストでa のキャレット位置を設定する必要がある同様の質問をしたところ、 (プログラムで作成された入力で selectionStart を使用して) 有効な回答を得たので、Jasmine で実装できる潜在的な解決策を次に示します。 :

describe('test at user', function () {
    /* some init code */
    it('should get caret postion', function () {
        textarea = element.find('textarea');
        textarea.triggerHandler('focus');
        expect(textarea.scope().caretPos).toEqual(0);

        /*
         * then i want to simulate keydown event and type something
         * and get the caret postion
         * but i dont know how to do it
         */

        document.body.appendChild(textarea[0]); // I discovered this to be the key to using the .selectionStart property successfully
        textarea.val('some text');
        textarea[0].selectionStart = 9; // you need to move the caret manually when doing things programmatically

        textarea.triggerHandler('focus');
        expect(textarea.scope().caretPos).toEqual(9);
    })
})
于 2014-03-21T19:59:34.933 に答える