Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:在指令模板函数中返回承诺_Javascript_Angularjs_Templates_Websocket_Angularjs Directive - Fatal编程技术网

Javascript AngularJS:在指令模板函数中返回承诺

Javascript AngularJS:在指令模板函数中返回承诺,javascript,angularjs,templates,websocket,angularjs-directive,Javascript,Angularjs,Templates,Websocket,Angularjs Directive,正如标题所述,我希望在指令模板函数中返回一个承诺,即: angular.module('someModule', []) //... .directive('someDirective', function() { return { //... restrict: 'E', template: function() { var deferred = $q.defer(); //Some Async functi

正如标题所述,我希望在指令模板函数中返回一个承诺,即:

angular.module('someModule', [])
  //...
  .directive('someDirective', function() {
    return {
      //...
      restrict: 'E',
      template: function() {
        var deferred = $q.defer();

        //Some Async function which will call deferred.resolve

        return deferred.promise; //Promise not supported by template property
      }
    };
  });
由于template属性不支持这一点,有没有(简单的)方法来“模拟”这一点

看起来指令解析是我最好的选择,但我很难想出一个好方法来在解析方法中应用从WebSocket加载的模板


我的目标是为所有通信使用单个WebSocket连接。

在“解析”中返回模板,请遵循dan wahlin的动态加载控制器示例,并对指令执行与routeResolver.resolve函数相同的操作


请让我知道如果它不起作用,我将创建plunker并更新它

您可以尝试另一种方法:

app.run(function($templateCache, myTemplateLoader) {
    myTemplateLoader.load('templateName').then(function(content) {
        $templateCache.put('templateName', content);
    });
});
现在,您只需在指令中使用
templateUrl
属性即可:

app.directive('someDirective', function() {
    return {
        // ...
        templateUrl: 'templateName'
    };
});

控制器属性如何?是的,这是一个选项。但是如果我理解正确的话,那么我需要指定一个虚拟模板,其中包含类似ng include的内容,然后编译从websocket调用获得的模板,并将其设置为ng include中使用的src变量。我希望用一种不太迂回的方式来做这件事。$templateCache看起来很有希望。但是我很难让你的代码正常工作。“myTemplateLoader”是我自己创建的自定义服务吗?它有一个返回承诺的加载方法?在指令中不应该是“templateUrl”而不是“template”吗?否则,我不明白angular如何知道“templateName”应该被视为模板请求,而不仅仅是模板字符串。如果我让它工作,那将立即加载所有模板(在run块中),对吗?@Arokh是的,
myTemplateLoader
的实现取决于您,因为您已经说过要使用WebSocket(我不知道它的内置支持)。是的,它应该是
templateUrl
,而不是
template
。我的错。我会修正答案。@Arokh回答您的最后一个问题,是的,这样所有模板都将预加载并缓存在
运行
块中。我知道这可能是可取的,也可能是不可取的。我将以此作为答案,因为它不需要我编译从websocket获得的模板。嗯,那篇文章看起来好像解决了一个不同的问题。如果我误解了,我可以在哪里放置异步(websocket)调用来加载模板?