在 $http.get() 之后动态更改指令的 templateURL

Change templateURL of directive dynamically after $http.get()

我正在研究 'skeleton' 在不同组件中加载 UI。我有一个指令,我最初要加载一个模板(这个模板的不透明度很低,看起来像一个模拟 table)。一旦我在 http.get() 中获得我需要的数据,我就想更改指令的 templateUrl。以下是我迄今为止尝试过的方法。

function registers($log, $state, $templateCache, currentCountData, storeFactory) {
    var directive = {
        restrict: 'A',
        scope: true,
        templateUrl: '/app/shared/tableMock/tableMock.html',
        link: link
    };

    return directive;

    function link(scope, element, attrs) {
        storeFactory.getRegisters().then(function (data) {
            scope.registers = data.registers;
            $templateCache.put('/app/dashboard/registers/registers.html');
        });
    }
}

我不确定我的方向是否正确。我可以逐步查看 storeFactory return 来自 factory 的正确数据。我怎样才能更改指令的 templateUrl

this 问题的帮助下,我得到了这个

function link(scope, element, attrs) {                        
    storeFactory.getRegisters().then(function (data) {
        scope.registers = data.registers;
        $http.get('/app/dashboard/registers/registers.html', { cache: $templateCache }).success(function (tplContent) {
            element.replaceWith($compile(tplContent)(scope));
        });
    });
}

tplContent$http.get() 的响应相关。它是 registers.html 文件中的 html。 element 代表指令本身。

对于这种情况,我通常在我的指令模板中做这样的事情:

<div ng-switch="viewState">
  <div ng-switch-when="gotRegisters">
   Content for when you get the registers
  </div>
  <div ng-switch-default>
   For when you don't have the registers
  </div>
</div>

这样您就可以更改一个变量来显示您的内容ie scope.viewState = 'gotRegisters';,而不是在您已经下载寄存器后等待它下载。