3

我正在尝试用 angularjs 实现“@用户功能”,除了编写单元测试外,我几乎完成了该功能。我有一个插入符号模块,可以帮助我在 textarea 中获得插入符号的位置。

我认为最重要的是获得插入符号的位置,但我不知道如何在茉莉花中做到这一点。

我的指令

.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
         * /
    })
})

还有一件事是我不想使用 jquery。

谁能帮我?

多谢!

4

1 回答 1

1

我刚刚问了一个类似的问题,我需要textarea在 Jasmine 测试中设置 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 回答