2013-03-19 20 views
5

的结果是否有任何表面上的问题,与下面的代码片段:Angular.js看一个函数调用

<ul id="entry-name" class="breadcrumb"> 
     <li ng-repeat="dir in pathElements()" class="active"> 
      <span ng-show="!$last"> 
       &nbsp;<a href="#!?path={{dir.url}}">{{ dir.name }}</a>&nbsp;<span ng-show="!$first" class="dividier">/</span> 
      </span> 
     </li> 
     <li class="active">{{ pathElements()[pathElements().length - 1].name }}</li> 
    </ul> 

这个JS:

$scope.pathElements = function() { 
     var retval = []; 
     var arr = $scope.currentPath().split('/'); 
     if (arr[0] == '') { 
      arr[0] = '/'; 
     } 

     var url = "/"; 
     retval.push({name: arr[0], url: url}); 
     for (var i = 1; i < arr.length; ++i) { 
      if (arr[i] != '') { 
       url += arr[i] + '/'; 
       retval.push({name: arr[i], url: url}); 
      } 
     } 
     return retval; 
    }; 

这似乎是造成“错误: 10 $ digest()迭代达到。中止!“错误,但我不知道为什么。是否因为pathElements()每次都返回一个新数组?有没有办法解决这个问题?

+0

您认为缓存路径数组是否有意义?你正在调用这个函数3次。除此之外,你有没有想过使用$ routeParams? – 2013-03-19 07:15:13

+0

@Flek我分裂的“路径”不是实际的url路径,它是一个传递给url的参数(比如'localhost:8000 /#?path =/some/path')但是,对,应该可以缓存它。 – Alec 2013-03-19 22:13:38

回答

4

是的,这是因为您每次都返回一个新数组,并且$ digest循环无限循环(但是Angular会停止它)。你应该在函数之外声明它。

$scope.pathArray = []; 
$scope.pathElements = function() { 
    // retval becomes $scope.pathArray 
    if (weNeedToRecalcAllPathVariables) { 
    $scope.pathArray.length = 0; 
    // ... 
    } 

    // ... 
} 

我们使用$scope.pathArray.length = 0而不是创建一个新的,以避免它连续发射。

您还应该考虑@Flek的建议。在你需要重新计算的时候只调用一次该函数。所有你绑定的应该是直接在$scope.pathArray之上。

如果你确实需要一个函数来在使用它之前测试它的clenaning状态,那么至少我建议你创建两个单独的函数,只是为了保留每个函数的属性。

+0

好吧,这使得更多的意义,但现在我不知道如何知道何时更新'pathArray'。我得到的'路径'来自url参数(特别是'$ location.search()。path')。我可以安全地观察该表达式吗? – Alec 2013-03-19 22:35:56

+0

是的,你可以。但是你需要观察一个返回引用值的函数:'$ scope。$ watch(function(){return $ location.search()。path;},function pathChanged(newValue){});'as as There is没有办法直接绑定到服务。 – 2013-03-20 02:47:30