角$表并不在我的指令触发任何事件(Angular $watch does not fire any

2019-10-19 03:19发布

我尝试更新的元素含量取决于我的自定义指令的属性值。 下面的代码在现场负载表现良好,但只有一次。 在属性值动态更新不会触发任何事件。 我该怎么办错了吗?

标记重复(比赛在比赛中)内:

<div ng-tipp-result="[[getIconClass(match)]]"></div>

指示:

myApp.directive('ngTippResult', function() {
    return {
        restrict: 'A',
        link: function(scope, elem, attrs) {
            var content = "s";

            scope.$watch(attrs.ngTippResult, function(v){
                switch(v){
                    case 1: content = '<i class="icon-circle"></i>';break;
                    case 2: content = '<i class="icon-X"></i>';break;
                    case 3: content = '<i class="icon-Y"></i>';break;
                    case 4: content = '<i class="icon-Z"></i>';break;
                    case 5: content = '<i class="icon-ok"></i>';break;
                    case 6: content = '<i class="icon-minus"></i>';break;
                }

                elem.html(content);
            });
        }
    };
});

编辑:

使用属性名称作为字符串解决了这个问题,但造成的另一个,我遇到了一个无穷远消化循环与上面的代码。

<li ng-repeat="match in matches">
    <i class="pull-right [[getIconClass(match)]]"></i>
</li>

getIconClass是返回取决于匹配从1至6的值的控制器方法。

Answer 1:

第一个参数$watch应该是你想要观看的价值getter函数。 尝试

scope.$watch(function(){return attrs.ngTippResult}, function(v){...});

请参阅该文档在这里 。

什么是可能发生的是, attrs.ngTippResult被评估为String。 字符串是一个有效的输入,但我不认为这是你的原意; 好像你想要一个更新每次attrs.ngTippResult变化。 相反,当前的代码是看与attrs.ngTippResult的值范围属性(例如,如果attrs.ngTippResult是"fish" ,该值你会与你当前的代码看实际上是$scope.fish ,这可能不是你想要的。

编辑

此外,你想做什么aaronfrost的回答可能是最好的。



Answer 2:

你可以映射属性到你的指令范围:

myApp.directive('ngTippResult', function() { return { scope: { theTippResult:"=ngTippResult", ...}}});

那么你只需要把变量名的字符串: scope.$watch('theTippResult', function(v){...});

- 或 - 使用功能的方法类似Hylianpuffball建议,但我还是把它映射到你的模型,就像“自我记录”的代码。



Answer 3:

对于ATTRS的指令对象,则不应使用范围。$手表。 您应该使用ATTRS。$观察。 它始建让你看的属性值,而不进行手表。 但是,语法几乎是相同的。

查看文档在这里



文章来源: Angular $watch does not fire any event in my directive