我有一个自定义的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);
}
这没有做任何事情,即使在重新编译时我可以看到我在范围内有了新的价值。
欢迎任何建议。
答案 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指令隐藏/显示它。