当属性更改值时,指令不运行链接function

我已经创建了一个指令,用于将qTip2库封装到我的角度应用程序中(如另一个SO问题中所述 )。 我有一个字典,其中包含qTip的不同配置,并且根据我传递给属性cv-tooltip的值,在链接函数的.qtip调用中传递了相应的配置。 这适用于在html中设置的指令(例如,在右侧显示qtip,在左侧显示cv-tooltip =“left”)。

当我从另一个指令将cv-tooltip =“right”的属性值更改为cv-tooltip =“left”时出现问题,当值发生变化时,tooltip指令链接函数不会重新运行,因此qTip不会使用正确的配置更新。

qtip指令如下所示:

mainApp.directive('cvTooltip', function () { var optionDictionary = { 'right': { position: { my: 'center left', at: 'right center' }, style: { tip: { corner: 'left center', height: 10 } } }, 'left': { position: { my: 'center right', at: 'left center' }, style: { tip: { corner: 'right center', height: 10 } } } }; return { restrict: 'A', scope: { positionType: '=cvTooltip' }, link: function (scope, element, attrs) { var options = { style: { tip: { width: 13 } }, position: { target: element } }; var defaults = optionDictionary[scope.positionType]; $.extend(options, defaults); element.qtip('destroy'); element.qtip(options); } } } ); 

其他指令如下:

  mainApp.directive('cvErrorOnBlur', ['$compile', function () { return { restrict: 'A', require: 'ngModel', replace: true, link: function (scope, element, attributes, controller) { element.bind("blur", function () { if (controller.$dirty && controller.$invalid) { element.addClass('error'); element.attr('cv-tooltip', 'left'); } else { element.removeClass('error'); element.attr('cv-tooltip', 'right'); } }); } } }]); 

在HTML中,我使用它

   

您必须使用$ observe或$ watch来监视属性的更改,但必须插入属性的值({{}})

例:

  attrs.$observe('cvTooltip', function(newValue, oldValue) { }); 

你能把它重写成一个指令吗?

 mainApp.directive('cvTooltip', function () { var optionDictionary = { 'right': { position: { my: 'center left', at: 'right center' }, style: { tip: { corner: 'left center', height: 10 } } }, 'left': { position: { my: 'center right', at: 'left center' }, style: { tip: { corner: 'right center', height: 10 } } } }; return { restrict: 'A', require:"^ngController", link: function (scope, element, attrs, controller) { var initialValue = attrs.cvTooltip; console.log(initialValue); var options = { style: { tip: { width: 13 } }, position: { target: element } }; if (controller.$dirty && controller.$invalid) { element.addClass('error'); var defaults = optionDictionary['left']; $.extend(options, defaults); element.qtip('destroy'); element.qtip(options); } else { element.removeClass('error'); var defaults = optionDictionary['right']; $.extend(options, defaults); element.qtip('destroy'); element.qtip(options); } } }