在我的AngularJS应用程序中,我有一个包含a 模板: 控制器: 当资源 在这些情况下,我专注于 我的问题是: 如果函数调用设置了 控制器 自定义指令添加到textarea 别的地方 ......为什么? 这是关于分离关注点的问题. 控制器似乎是最明智的地方,但我理解控制器不应该执行DOM操作......这需要使用 自定义指令需要订阅控制器广播的事件,然后设置自己的焦点和选择范围.这将问题分开,但根据Angular Best Practices, 我想控制器和指令可以通过另一个服务进行通信,但这看起来就像是过度工程 - 这是我臭名昭着的,并且在这里努力避免!:-) 提前致谢! 为了完整起见,这是我根据@ kristin-fritsch的回答编写的自定义指令: 指示 为了实现它,我将指令属性添加到我的textarea: ... 当promise被拒绝时,设置我的控制器中
小智..
5
我建议你向textarea添加一个指令. 那么你可以设置$ promise被拒绝的位置 并在errorPosition - 指令中处理DOM操作. 我建议你向textarea添加一个指令. 那么你可以设置$ promise被拒绝的位置 并在errorPosition - 指令中处理DOM操作.和提交按钮的模板.A
)包装这两个元素并有一个控制器.当单击提交按钮时,控制器将$ resource服务用于
POST
从REST API 到值的值.
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
.元素并设置从
error.position
下一个非单词字符的选择范围.我有一个功能,这一切都很好.(在承诺被拒绝之后)的选择范围,则执行...
$element
服务(或jQuery)来做到这一点.$broadcast
并且$on
只应用于"在整个应用程序中与全球相关的事件".
解
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);
}
});
}
}
};
}
vm.selection
具有start
和end
属性的对象的值.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};
}
});
$scope.errorPosition = 50;
1> 小智..:$scope.errorPosition = 50;
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有