重新链接/触发指令

时间:2015-03-05 17:55:44

标签: angularjs angularjs-directive

我有一个自定义的datepicker指令,它在ng-repeat中。当我修改从父控制器传递到指令中的值时,它们没有反映在屏幕上,我仍然看到旧值,我在指令范围内检查了新值,但是没有反映在日期选择器。

我尝试使用rootscope来广播已经进行了更改,并尝试重新编译我的指令,如下所示:

控制器中的

$rootScope.$broadcast('relinkDatepicker');

在链接功能中:

$rootScope.$on('relinkDatepicker',function(){
                        scope.relink();
                });
scope.relink = function(){
                    console.log(scope);
                    console.log(element[0].outerHTML);
                    $compile(element[0].outerHTML)(scope);
                }

这没有做任何事情,即使在重新编译时我可以看到我在范围内有了新的价值。

欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

你的方法,即使它确实有效,也会比解决方案更糟糕。您不需要重新编译指令以获取要更新的值。

您需要解决手头的问题,即未在视图中反映的范围值。在没有看到你的代码的情况下,很难说清楚,但我猜测你正在改变范围值,因为在角度不知道的事件中(例如jQuery / jQlite事件)

例如,如果您在点击事件中更新视图,请确保包含 $scope.apply 行:

angular.module('example', [])

.directive('exampleDirective', function () {

  return {

    restrict: 'E'

    link: function (scope, element, attrs) {
      element.on('click', function () {
        scope.$apply( function () {
          scope.someProperty = "someValue";
        });
      });
    }

  }

});

如果没有将更改包含在scope.$apply中,这将无效,因为角度不了解'click'事件。 Google"角度消化循环"有关此主题的更多信息。

答案 1 :(得分:0)

可能为时已晚,但我发现重新实例化指令的最简单方法是通过ng-if指令隐藏/显示它。