AngularJS动态表单字段ID,指令不起作用

cra*_*eum 7 javascript jquery angularjs

尝试将指令添加到具有动态ID的输入时,链接方法无法正确绑定到该对象.给出以下jsfiddle或html:

<div ng-app="myApp" ng-controller="MyCtrl">
  <p>Date: <input type="text" id="datepicker-{{id}}" datepicker></p>    
</div>
Run Code Online (Sandbox Code Playgroud)

和js:

var module = angular.module('myApp', []);

module.directive('datepicker', function() {
  var linker = function(scope, element, attrs) {
    element.datepicker();
  }

  return {
    restrict: 'A',
    link: linker
  }
});

function MyCtrl($scope) {
  $scope.id = 7
}
Run Code Online (Sandbox Code Playgroud)

我在控制台调试器上看到的是,当调用链接时,它会将id显示为"datepicker - {{id}}"而不是"datepicker-7".

有没有办法强迫这种情况发生?实现这个的更好方法是什么?

更新:应该澄清一下.单击时会显示日期选择器,但单击日期不起作用.我收到错误:"此datepicker的未捕获的实例数据"

Bri*_*ian 13

我相信你需要transclude:true在你的指令返回对象,它告诉angular预处理标记,例如{{ }}绑定.

您还需要将调用包装datepicker()在a中$timeout以延迟尝试,直到下一个角度循环运行,确保在DOM中设置了已转换的ID.

这在jsfiddle中对我有用

var module = angular.module('myApp', []);

module.directive('datepicker', function($timeout) {
    var linker = function(scope, element, attrs) {
        $timeout( function(){
            element.datepicker();
        });
    }

    return {
        restrict: 'A',
        link: linker,
        transclude: true
    }
});

function MyCtrl($scope) {
    $scope.id = 7
}
Run Code Online (Sandbox Code Playgroud)

  • @craineum对不起,我错过了你的那部分问题.我在你调用datepicker的地方添加了一个$ timeout包装器,这似乎有效.将更新答案.根据我的理解,$ timeout延迟调用内部函数直到下一个角度循环.我认为没有它,在angular转换元素ID之前调用了datepicker().将其包装在$ timeout中可确保在尝试使用datepicker-ize之前设置正确的ID. (2认同)
  • 就是这样.有了这个,你也不需要转换,可以从你的答案中删除.真棒!谢谢! (2认同)