【问题标题】:ng-include - Controller is called multiple timesng-include - 多次调用控制器
【发布时间】:2013-06-14 13:34:28
【问题描述】:

情况

我正在尝试使用ng-include 包含一个部分而不需要任何路由。我只想动态地包含许多的特定部分。这或多或少是这样的:

<div ng-controller="SomeController">
    //This controller defines a $scope.getPartial(id)
    <ng-include src="getPartial(something.id)"></ng-include>
</div>

它有效,包括部分。但是查看控制台我可以看到控制器被调用了几次,第一次调用时,我得到了 404

GET path/to/partials/undefined.html [HTTP/1.1 404 Not Found 162ms]

似乎 something.id 没有定义,当第一次包含时。

问题

  • 如何在不创建新范围的情况下简单地包含部分内容?
  • 如果这不可能,我如何确保只调用一次控制器?
  • 我该如何避免 404?

我对 AngularJS 还很陌生,因此可能会对某些东西做出错误的假设或遗漏一些明显的东西,请赐教。

【问题讨论】:

    标签: angularjs angularjs-ng-include


    【解决方案1】:
    1. ngInclude 根据定义创建一个新范围,因此您不能轻易绕过它。而且,由于嵌套范围相互继承,您新创建的范围将能够读取您的 SomeController 中的任何内容,因此您应该不会对新范围有任何问题。
    2. ngInclude 的 src 属性将在每个 $digest 范围内重新评估,因此您无法阻止它重复调用控制器的方法。为此,您需要确保您的方法轻巧快速,并且在给定相同输入的情况下返回相同的输出
    3. 当 id 尚未定义时,您可以通过返回空字符串“”来避免初始 404:

     

    $scope.getPartial = function(id){
      if(!id){
        return "";
      }
      ...
    }
    

    【讨论】:

    • +1。我还想补充一点,很多东西会被多次调用,有时甚至是意想不到的时间。你需要将你的理解从命令式转变为声明式。想想css。您不在乎(通常)浏览器根据样式/类更改重绘、重排多少次
    • 谢谢,这似乎有点老套,但也许我只是不习惯重绘范例;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多