Javascript 在运行时添加AngularJS指令

Javascript 在运行时添加AngularJS指令,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我正在创建一个游戏,其中需要发生的第一件事是从外部JSON文件加载一些状态-我的一个指令的内容取决于可用的数据-因此,我想延迟应用指令,直到数据加载之后。我写了以下内容: window.addEventListener('mythdataLoaded', function (e) { // Don't try to create characters until mythdata has loaded quest.directive('character', function() {

我正在创建一个游戏,其中需要发生的第一件事是从外部JSON文件加载一些状态-我的一个指令的内容取决于可用的数据-因此,我想延迟应用指令,直到数据加载之后。我写了以下内容:

window.addEventListener('mythdataLoaded', function (e) { 
// Don't try to create characters until mythdata has loaded
quest.directive('character', function() {
      return {
        restrict: 'A',
        scope: {
          character: '@'
        },
        controller: 'CharacterCtrl',
        templateUrl: 'partials/character.html',
        replace: true,
        link: function(scope, element) {
          $(document).on('click', '#'+scope.character, function () {
              $('#'+scope.character+'-popup').fadeToggle();
          });
        }
      };
   });
});

// Load in myth data
var myth_data;
$.getJSON("js/mythdata_playtest.json", function(json) {
   myth_data = json;
   window.dispatchEvent(new Event('mythdataLoaded'));
});

然而,我的指令的link函数似乎从未运行过——我认为这是因为angular在添加该指令时已经执行了指令编译/链接的周期部分。是否有某种方法可以在创建该指令后强制angular编译该指令?我在谷歌上搜索了一下,有人建议在link函数中添加$compile来解决类似的问题——但是link函数从来没有运行过,所以在这种情况下不起作用。谢谢

在我看来,最好总是配置指令,在指令中执行JSON调用,并将逻辑附加到JSON调用的
success
处理程序中的元素。如果我理解正确的话,这会满足你的要求

AngularJS是一个框架,而不是一个库,因此不建议以您提到的方式使用它。正如您所提到的,AngularJS在运行时为您做了很多事情。默认情况下,AngularJS在加载的文档上运行,然后会出现
$.getJSON
回调。当AngularJS运行时,它在编译内容等方面发挥了所有的魔力


作为旁注,使用
$http
而不是
$更像是一种有角度的方式。getJSON

我认为您的想法是错误的。angular的一个主要思想是设置声明性元素,让它对范围的状态做出反应

我认为您可能想要做的是通过指令作用域传入所需的内容,并使用其他角度内置指令隐藏或显示默认(“非指令”)状态,例如,直到从控制器设置了作用域

例如:
您希望在api调用返回之前隐藏一个框。指令在元素上设置特殊样式(不隐藏)。与延迟动态设置指令不同,您可以传入一个带有默认值的范围变量,并在指令模板中使用类似于
ng show=“data.ready”
的内容来处理实际的dom内容。

为什么要否决?我宁愿有一个评论来解释我如何更好地表达我的问题,而不是一个通用的“这太糟糕了”来阻止我得到我需要的答案。谢谢-问题是,这个指令附在几个元素(“我游戏世界中的角色”)上-我有数据要加载一次。。。我认为JSON调用不属于该指令。我能想到的最好方法是在我的登录控制器(未显示)中进行JSON调用,然后让该控制器在变量中设置URL,以便在加载JSON后可以包含我的所有内容(包括包含该指令的字符)。。。但这似乎不太好,因为在我的世界中,有大量静态内容可以在等待JSON返回的同时加载。如果这是AngularJS系统中的共享逻辑,那么它属于服务。服务是一个AngularJS组件,可以将依赖注入指令、控制器等,并提供功能或数据。看,什么属于服务?JSON调用?它只需要发生一次。是的,JSON调用,可能还有组件之间共享的游戏数据。服务创建一次,并传递给注入它的每个组件(简言之:依赖项注入单例)。它可以在初始化时执行JSON调用。是的,但是在我的控制器中,有几个函数都依赖于可用的数据。我希望有一种简单的方法来阻止它们全部运行(因为在加载数据之前,我实际上不需要将指令绑定到HTML——没有它就没用了),而不是必须进入每个指令并给它一个默认值。