- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 AngularJS 应用程序中,我有一个包含 <textarea>
的模板和一个提交按钮。 <div>
(它可以很容易地成为一个 <form>
)包装了这两个元素并有一个 Controller 。 Controller 使用 $resource服务于POST
来自 <textarea>
的值单击提交按钮时发送到 REST API。
模板:
<div ng-controller="MyController as vm">
<textarea ng-model="vm.text" rows="5"></textarea>
<button ng-click="vm.save()">Save</button>
</div>
Controller :
angular.module('myApp')
.controller('MyController', MyController);
MyController.$inject = ['myRestApiResource'];
function MyController(myRestApiResource) {
var vm = this;
vm.save = function() {
var params = [];
var postData = {text: vm.text};
myRestApiResource.save(params, postData)
.then(function(res) { /* success handler */ })
.catch(function(res) { /* error handler */ });
};
}
当资源save()
方法的 $promise被拒绝,响应数据(在某些情况下)包含 error.position
引用在 vm.text
中检测到语法错误的字符串索引的属性.
在那些情况下,我关注 <textarea>
元素和 set the selection range来自 error.position
到下一个非单词字符。我有一个功能,一切正常。
我的问题是:
应在 <textarea>
上设置选择范围的函数调用(在 promise 被拒绝后)在...中执行
...为什么?
这是一个关于关注点分离的问题。
Controller 似乎是最明智的地方,但我的理解是 Controller 不应该执行 DOM 操作......这需要使用 $element
服务(或 jQuery)就是为了做到这一点。
自定义指令需要订阅 Controller 广播的事件,然后设置自己的焦点和选择范围。这将问题分开,但根据 Angular Best Practices $broadcast
和 $on
应该只用于“在整个应用程序中与全局相关的事件”。
我想 Controller 和指令可以通过另一个服务进行通信,但这似乎是过度工程——这是我臭名昭著的并且在这里努力避免的事情! :-)
提前致谢!
为了完整起见,这是我根据@kristin-fritsch 的回答编写的自定义指令:
指令
angular.module('myApp')
.directive('selectionRange', selectionRangeDirective);
function selectionRangeDirective() {
return {
restrict: 'A',
scope: {
selectionRange: '='
},
link: function(scope, iElement) {
var element = iElement[0];
if (element.setSelectionRange && typeof element.setSelectionRange === 'function') {
scope.$watch('selectionRange', function(range) {
if (range && typeof range.start === 'number' && range.start > -1 && range.start < iElement.val().length) {
element.focus();
element.setSelectionRange(range.start, range.end);
}
});
}
}
};
}
为了实现它,我将指令属性添加到我的文本区域:
<textarea ng-model="vm.text" rows="5" selection-range="vm.selection"></textarea>
...并设置 vm.selection
的值到带有 start
的对象和 end
当 promise 被拒绝时,我 Controller 中的属性。
myRestApiResource.save(params, postData)
.then(function(res) { /* success handler */ })
.catch(function(res) {
var error = res.data.error;
if (error && error.position) {
var start = error.position;
var end = start + vm.text.substr(start).search(/(\W|$)/);
vm.selection = {start: start, end: end};
}
});
最佳答案
我建议您向文本区域添加一个指令。
<div ng-controller="MyController as vm">
<textarea ng-model="vm.text" data-error-position="errorPosition" rows="5"></textarea>
<button ng-click="vm.save()">Save</button>
</div>
然后你可以像这样设置 $promise 被拒绝时的位置
$scope.errorPosition = 50;
并在 errorPosition - 指令中处理 DOM 操作。
关于javascript - AngularJS:在解决 promise 后更新表单字段的代码属于哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113751/
我尝试通过正则表达式将文本中的单引号更改为双引号。 (单字)示例:我走了。 You gona fly to planet 'Ziqtos' => 我需要在 I'm 中保留单引号,并在 You gona
我正在构建一个 API,其中大部分将包含 JSON 和 HTML 内容。但是一些非常具体的端点只呈现 true 或 false,并且还在 POST 中接受 true 或 false。这是请求或响应的整
我是一名优秀的程序员,十分优秀!