Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS-如何通过控制器关注元素_Angularjs_Angularjs Directive_Angularjs Service - Fatal编程技术网

AngularJS-如何通过控制器关注元素

AngularJS-如何通过控制器关注元素,angularjs,angularjs-directive,angularjs-service,Angularjs,Angularjs Directive,Angularjs Service,我知道这个问题已经被问了很多次,但我似乎找不到任何地方如何从控制器中聚焦到元素。最好的方法是什么?做一个指令会更好吗?但如果是这样的话,那么我将如何在控制器中调用它?还是创建一个服务更好? 我在HTML代码中已经拥有并能够正常工作的是一个指令: .directive('ngxFocus', ['$timeout', function($timeout) { return function(scope, element, attr) { $timeout(function

我知道这个问题已经被问了很多次,但我似乎找不到任何地方如何从控制器中聚焦到元素。最好的方法是什么?做一个指令会更好吗?但如果是这样的话,那么我将如何在控制器中调用它?还是创建一个服务更好?

我在HTML代码中已经拥有并能够正常工作的是一个指令:

.directive('ngxFocus', ['$timeout', function($timeout) {
    return function(scope, element, attr) {
        $timeout(function () { 
            element.focus();
         }, 10);
      };    
}])
app.directive('rfocus',function(){
    return {
        restrict: 'A',
        controller: function($scope, $element, $attrs){
            var fooName = 'setFocus' + $attrs.rfocus; 
            $scope[fooName] = function(){
                $element.focus();                
            } 
        },
    }    
});
我可以在控制器内调用指令吗?我仍在学习AngularJS,我有点困惑在这种情况下最好的方法是什么。我真的很想通过控制器来做这件事,现在我用一行简单的jQuery来对焦,但这不是角度的方式,所以我想用正确的方式。


更具体地说,举一个例子,假设我在HTML中有10个输入,并且假设在函数(在控制器中定义)的执行过程中,我希望关注直接来自函数的多个输入中的1个(同样,这些都是在控制器中声明的)。如果可能的话,我不希望在HTML代码中写任何东西,而是调用一个focus函数或将焦点放在我选择的输入上的东西。我知道我可以用jQuery编写它,只需使用
$('input12').focus()
示例

有关我的表单的更明确的示例。。。我有一个连接到雅虎网络服务(股票市场)的第一个输入,用户填写的这个输入将持有一个股票报价符号,可以在世界任何地方,然后用户将选择(从下拉列表中)他的银行帐户。。。现在,我的控制器将检查股票报价市场是否与用户的银行帐户使用相同的货币(例如:GOOG是美元,如果用户的帐户使用$CAD,它将失败,因为GOOG使用$USD)。如果货币不一样,我想建议我的用户,为了做到这一点,我更愿意将重点放在字段上,以便他在出错时可以更改符号。

我最近也开始学习角度,但希望我能为您提供一种不同的方法

我也一直在使用一些基本的jQuery来集中精力,所以在这方面,我真的帮不了你。然而,关于在控制器中调用指令,我找不到任何说“是的,你可以”或“不,你不能”的文章。我知道你可以在指令中声明控制器,所以你可以这样做:

.directive('ngxFocus', function() {
    return {
        restrict: 'A',
        controller: //do your controller stuff here
}])

我已作出以下指示:

.directive('ngxFocus', ['$timeout', function($timeout) {
    return function(scope, element, attr) {
        $timeout(function () { 
            element.focus();
         }, 10);
      };    
}])
app.directive('rfocus',function(){
    return {
        restrict: 'A',
        controller: function($scope, $element, $attrs){
            var fooName = 'setFocus' + $attrs.rfocus; 
            $scope[fooName] = function(){
                $element.focus();                
            } 
        },
    }    
});
它添加到控制器的
$scope
函数中,以设置元素的焦点。函数的名称基于属性中给定的值

使用:
将创建可在控制器中使用的函数
setFocusInput1()


这里有一个问题:

如果您试图使用控制器中的元素,请确保您出错了,控制器的目标是将从服务接收的数据绑定到视图,而不是操纵视图。
如果要关注具有管线更改的图元,请执行以下操作:

app.directive('focuser', ['$location', function ($location) {
  return {
    restrict: 'A',
    link: function ($scope, $element) {
      $scope.$watch(function () {
        //simply focus
        $element.focus();
        //or more specific
       if ($location.$$url == '/specific/path') {
         $element.focus();
       }
      });
    }
  };
}]);

我知道这是一个老问题,但这里有另一种方法,在控制器中将变量设置为true,这就是将焦点设置为元素的操作

试试这个:

myAngularModule.directive('goFocus', ['$timeout', function ($timeout) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            scope.$watch(attrs.goFocus, function (newValue) {
                if (newValue) {
                    $timeout(function () {
                        element[0].focus();
                    }, 100);
                }
            });
            element.bind("blur", function (e) {
                $timeout(function () {
                    scope.$apply(attrs.goFocus + "=false");
                }, 10);
            });
            element.bind("focus", function (e) {
                $timeout(function () {
                    scope.$apply(attrs.goFocus + "=true");
                }, 10);
            });
        }
    }
}]);
在HTML模板中:

<input go-focus="focusvar1" type="text" ng-model="mytext1" />
<input go-focus="focusvar2" type="text" ng-model="mytext2" />
<input go-focus="focusvar3" type="text" ng-model="mytext3" />
<button ng-click="doFocus()">OK</button>

我认为您不会发现比使用一行jquery更短的解决方案。无论您是创建服务还是直接从controller创建服务,您都必须始终使用选择器,因为您始终需要选择要操作的元素。是的,我知道jQuery较短,但我认为这不是正确的方法。我正在寻找合适的角度方式…好的,检查我在下面发布的解决方案。也许这会让你满意;)嗯,好吧,但这无助于我在控制器内调用它。。。对“A”的限制,我相信这是默认值,所以我不需要定义它。我的指令在我的HTML中按我所希望的方式工作,但我正在研究如何通过控制器而不是通过HTML(DOM)来完成它。元素聚焦需要某种DOM操作,对吗?如果是这样的话,那么您必须使用该指令,因为控制器不应该用于DOM操作。顺便说一句,你关于将默认值限制为“A”的说法是对的,似乎我需要更彻底地阅读文档,这在某种程度上是正确的,但我在一个控制器函数中,我想关注该函数中的另一个元素(在控制器中),然后。。。我说的不是页面加载,我说的是一个需要关注未知元素的函数,只在函数内部已知。但这同样等于在我的HTML代码中写一些东西,我宁愿不。。。我如何直接在控制器中执行此操作?如果HTML中没有代码,这难道不可能吗?您希望如何在不使用其他属性的情况下选择特定元素?您不能同时将焦点设置为所有输入-您必须确定哪一个应该被聚焦。您可以使用
id
属性,然后使用jQuery选择一个输入(但“这不是角度的方式”),或者像上面那样创建指令,我可以在我的控制器中完成,实际上这就是我现在正在做的,但是我如何以角度的方式完成呢?如果我没有用HTML编写代码,如果我有20个输入,我不想在每个输入上写20次。你明白吗?我知道每个人都在说我们不应该在控制器内应用焦点,但让我在这里解释我的问题。。。我有一个数据服务,它返回一个JSON对象,在这个结果对象中,有一个信息告诉我表单中是否有错误,如果有,我将