从控制器设置 angularjs 指令属性

Set angularjs directive attribute from a controller

我正在使用 Angular Bootstrap typehead 指令,可以从 HTML 像这样配置它:

<div ng-controller="search">
  <input typeahead-focus-first="false" />
</div>

是否可以改为从 ng-controller 设置 'typeahead-focus-first' 属性?

如果您的控制器范围有 属性

$scope.typeahead = true;

然后

<div ng-controller="search">
  <input ng-if="typeahead" typeahead-focus-first="false" />
  <input ng-if="!typeahead" />
</div>

<div ng-controller="search">
  <input typeahead-focus-first="typeahead" />
</div>

第二种方法需要您的预输入指令能够解析预输入表达式。有几种方法可以实现这一点(例如隔离范围或 $parse)。 angular bootstrap 中的 typeahead 指令为您完成此操作,因此第二种方法应该有效。

编辑:作为指令

.directive('search', function() {
    return {
        restrict: 'E',
        template: '<div><input typeahead-focus-first="false" /></div>',
        scope: true,
        controller: function($scope) {
        },
        link: function(scope, element, attrs) {
            //this is where you want to do your DOM manipulation (if any)
        }
    };
})

用法:

<search></search>

提前输入 属性 是从 attr 中用这个表达式计算的:

var focusFirst = originalScope.$eval(attrs.typeaheadFocusFirst) !== false;

所以你应该在你的范围内设置一个变量

$scope.typeahead = true;

然后

<div ng-controller="search">
    <input typeahead-focus-first="{{typeahead}}" />
</div>

提前输入来源here

编辑: 从评论中可以看出,您似乎想从控制器编辑行为而不在 dom 上写任何东西。不幸的是,我认为这是不可能的,因为控制该行为的变量在编译时保存在闭包内,并且在链接组件后不可修改。您需要重新编译组件以更改该行为,例如使用 ng-if.