【问题标题】:Directive does not run link function when attribute changes value属性更改值时指令不运行链接功能
【发布时间】: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 />

【问题讨论】:

  • 链接函数只运行一次。leftright是父控制器上的变量
  • 我猜左右是指令定义中的静态字符串
  • 那么隔离作用域定义属性应该指向一个控制器变量
  • @Chandermani 正如 Ajay 所说,left 和 right 是传递给指令的静态字符串(即在大多数情况下它们是硬编码的)。当它们被 seconds 指令更改时,例外是验证。

标签: jquery angularjs angularjs-directive qtip2


【解决方案1】:

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

例子:

<input type="text" cv-tooltip="{{right}}" cv-error-on-blur />

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);
            }
        }
    }

【讨论】:

  • 我最终将它写在一个指令中。我不认为它是最佳的,但我没有使用 ng 的经验来做任何更好的事情。
猜你喜欢
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多