重新计算/重新初始化指令 - 在异步数据提取之后

时间:2015-12-11 12:44:38

标签: angularjs angularjs-directive

我有一个像这样的指令:

function timeDisplay() {
    var directive = {
        restrict: "E",
        link: function (scope, element, attrs) {
            scope.tooltip = scope.minutes > 60 ? (scope.minutes / 60) + " hrs" : scope.minutes + " mins";
        },
        replace: true,
        template: "<abbr uib-tooltip='{{ tooltip }}'>{{ minutes }}</abbr>", 
        scope: {
            minutes: "="
        }
    };
    return directive;
}

在某些地方,例如在ng-repeat上,这样可行。但在其他地方,我的页面控制器从服务器获取数据,但事实并非如此。

问题似乎是在解析页面时链接函数正在触发,因此当数据从服务器返回时,链接函数不会“重新运行”,因此工具提示永远不会被设置,因为第一次运行时minutes是空的。

当它在ng-repeat时,只有当数据已经存在时才调用链接函数,所以没关系。

如何重新运行链接功能,或者该指令的更好模式是什么?

1 个答案:

答案 0 :(得分:0)

假设你有<custom obj="object"></custom>。如果修改对象,则不会再次调用链接函数。你能做什么:

  1. 最佳 - 重写指令,因此它监视对象(指令中的$scope.$watch('obj'))以及它是否更改指令更新本身。 (这是ng-bind,ng-repeat,...的工作原理)或者你可以使用事件。
  2. 如果您只接收一次对象 - 只需使用ng-if,即对象是否承诺:
  3. <custom obj="object" ng-if="object.$resolved"></custom>
    
    1. 可怜的假ng-repeat:
    2. <div ng-repeat="a in fakeArray">
          <custom obj="object"></custom>
      </div>
      

      这里将fakeArray分配给['anything']将删除旧元素并添加新元素。