【发布时间】:2013-12-05 11:52:54
【问题描述】:
我创建了一个指令,用于将 qTip2 库封装到我的 Angular 应用程序中(如 another SO question 中所述)。我有一个为 qTip 提供不同配置的字典,并且根据我传递给属性 cv-tooltip 的值,适当的配置在链接函数的 .qtip 调用中传递。这适用于在 html 中设置的指令(例如,在右侧显示 qtip,在左侧显示 cv-tooltip="left")。
当我从另一个指令将属性的值从 cv-tooltip="right" 更改为 cv-tooltip="left" 时出现问题,当值更改时工具提示指令链接函数不会重新运行,因此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 中我像使用它一样
<input type="text" cv-tooltip="right" cv-error-on-blur />
【问题讨论】:
-
链接函数只运行一次。
left和right是父控制器上的变量 -
我猜左右是指令定义中的静态字符串
-
那么隔离作用域定义属性应该指向一个控制器变量
-
@Chandermani 正如 Ajay 所说,left 和 right 是传递给指令的静态字符串(即在大多数情况下它们是硬编码的)。当它们被 seconds 指令更改时,例外是验证。
标签: jquery angularjs angularjs-directive qtip2