3

全部:ng-repeat如何處理其內容的範圍變量

我是AngularJS指令作用域的新手。我想知道是否有人可以一般性地談論如何處理ng-repeat處理HTML中指定的變量的過程。

例如:

<html ng-app="app"> 
<body ng-controller="main"> 
    <div ng-repeat="d in data" ng-init="edited_odd_times=false" ng-click="editdata()"> 
     <span>{{d}}: {{edited_odd_times}}</span> 
    </div> 
</body> 


<script> 
    var app = angular.module("app", []); 
    app.controller("main", function($scope){ 
     $scope.data = [1, 2, 3, 4]; 
     $scope.data2 = [{d:1}, {d:2}, {d:3}, {d:4}]; 
     $scope.editdata = function(){ 
      // Here is my confuse, how can I access the d and edited_odd_times inside ng-repeat without putting them as paramters 

     } 
    }); 
</script> 
</html> 

我想知道的是:

[1]。我在想內$scope.editdata我怎麼能改變d和edited_odd_times沒有把它們作爲參數,或者我怎樣才能訪問由ng-repeat生成的範圍?

[2]。爲什麼ng-repeat可以影響HTML裏面的變量,而指令(比如我想定義一個像ng-repeat這樣的指令工作,但只能不重複)和scope:true和transclude不能影響該HTML中的變量?

謝謝

+2

爲什麼你不想將d傳遞給editData作爲參數?這是做到這一點的標準方法。你也應該避免使用ng-init。該文檔基本上說,從來沒有使用它在一個特定的用例期望。 – rob

+1

作爲對[2]的迴應,您可以創建一個影響transcluded作用域的指令。在這篇文章中看看題爲「The ways around」的例子http://angular-tips.com/blog/2014/03/transclusion-and-scopes/ – rob

+0

@rob謝謝,對於問題的後半部分[1] ,你能告訴我如何訪問ng-repeat的範圍嗎? – Kuan

回答

0

您的quastion的直接答案如下。

[1] 您應該認爲沒有辦法從其父作用域訪問子作用域中生成的值。 換句話說,控制器作用域不應該訪問指令中生成的作用域值。

[2] 您可以使用ngTransclude。請再次查看官方文件。

我想你想達到什麼就像下面。

在Html中。

<div ng-app="testapp" ng-controller="testctrl"> 
    <div ng-repeat="d in data"> 
     {{d}} 
    </div> 
</div> 

在控制器代碼中。

angular.module('testapp', []) 
.controller('testctrl', function($scope){ 
    $scope.data = [1,2,3]; 
    angular.forEach($scope.data, function(item, i){ 
     if (i%2==0){ 
      $scope.data[i] = item + '(edited)'; 
     } 
    }); 
}) 

jsfiddle is here.

我希望這可以幫助你。 :)