2014-08-28 64 views
1

如何使用ng-include这样的内容只会被加载一次? 以下是我有:AngularJS ng只包含一次

<div data-ng-if="%condition-1%" data-ng-include="%url-1%"></div> 
<div data-ng-if="%condition-2%" data-ng-include="%url-2%"></div> 
<div data-ng-if="%condition-3%" data-ng-include="%url-3%"></div> 
... 

在我来说,唯一的条件是真正的在一定的时间时刻。 任何情况都可以在页面生命周期中多次更改其值。 因此ng-include会一次又一次加载相同的内容。 如何告诉Angular只处理ng-include一次 - 当适当的条件第一次变为真时? 一次加载它们会导致页面死机,因为每个模板都很大很重。 也没有严格的条件变化顺序,例如,condition-3在页面生命周期中可能永远不会变为真 - 在这种情况下,我不想加载url-3内容。 谢谢!

UPDATE 是的,模板已经在缓存中。但它有一个复杂的内部结构,如引用外部图像,iframe等 - 所有这些东西都重新加载每次当我使用ng-include

+1

是不是模板放入缓存?否则,不能'ngShow'而不是'ngIf'工作? – Blackhole 2014-08-28 21:56:01

+1

它的'ng-if'.Template无论如何都会缓存在内部模板缓存中,一旦加载,问题是什么。 – PSL 2014-08-28 21:56:41

回答

1

你有很多的解决方案,但只有2此刻

1°,我想起更换NG-如果一个NG-显示,作为NG-如果删除DOM和所有儿童范围内有效,迫使该框架再次提出请求,而如果您使用的是ng-show,dom只会被隐藏,并且请求只会被创建一次。

2°如果您确实需要使用ng-if并且服务器中的内容是静态的,您可以通过手动访问由angular提供的$ templateCache服务来缓存它,或者如果您希望加载是html,你可以在javascript层上使用$ templateCache服务,或者使用ng-template标签预加载数据。

实施例:

<script id="url/you/want.html" type="text/ng-template"> 
<div>I am preloaded dom that responds to the url/you/want.html 
requests made by this application 
</div> 
</script> 

干杯

0

如何仅使用一个NG-包括和使用一些逻辑控制器中的切换使用的结合使用哪个资源?这种方式一次只能装载一个。

控制器

function($scope) { 
    $scope.activeTemplate = null; //some default or even null 

    $scope.$watch('condition', function(newvalue) { 

     //whatever logic you need to switch template 

     if (newvalue == 'condition1') { 
      $scope.activeTemplate = '/path/to/condition1.html'; 
     } else if (newvalue == 'condition2') { 
      $scope.activeTemplate = '/path/to/condition2.html'; 
     } else { 
      $scope.activeTemplate = '/path/to/default.html'; 
     } 
    }); 
} 

这样,只有一个模板,将永远在同一时间被加载,并且您已经减少绑定的数量从3比1(但是你已经如此有效地增加了手表从3到2也许)