Angular:在替换的元素中保留光标位置
Angular:在替换的元素中保留光标位置
从高层次来看:我继承了一些复杂的表单操作代码,其中存在一个重大的可用性错误——每次更改后,编辑文本字段会将光标移到输入文本的末尾。
我查看了这个问题,它似乎接近但并没有完全回答我的问题,因为相关元素正在使用include-replace模式。
我很难弄清楚如何结合这些方法。我不想改变输入的文本,只是确保光标不会跳动。
据我了解,链接函数在部分重新编译时被调用,而在底层模型发生更改时会发生重新编译,而用户编辑字段时则会发生每次更改。我可以通过在我的include-replace的链接函数中添加事件处理程序来捕获光标位置,但这不能访问即将被替换的元素。
myModule.directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', /* optional */ link: function (scope, el, attrs) { el.replaceWith(el.children()); el.on('change', function(event){ var cursorPosition = event.target.selectionEnd; console.log(cursorPosition); // where I expect it el.selectionEnd; = cursorPosition; // but obviously this don't work }); } }; });
我对整个angular编译/链接生命周期并没有非常深入的理解,尽管我已经多次阅读了所有文档。一个全面的流程图会很好...
在这个问题中,出现的原因是在Angular中,当元素被替换时,无法保留光标位置。解决的方法是使用$scope.$watch来监听元素的值的变化,并在每次变化时执行相应的函数来保留光标位置。
具体的解决方法如下:
1. 首先,在指令中引入$timeout服务。
2. 使用$scope.$watch来监听元素的值的变化,并在每次变化时执行相应的函数。
3. 在函数中使用$timeout来延迟执行代码,以确保在DOM元素被替换后再执行相应的操作。
具体的代码如下:
scope.$watch(function () { return el.val(); }, function (value) { $timeout(function(){ var cursorPosition = event.target.selectionEnd; console.log(cursorPosition); // 光标位置 el.selectionEnd = cursorPosition; // 保留光标位置 }); });
需要注意的是,在指令中需要引入$timeout服务。
希望这可以帮助你解决问题!