簡體   English   中英

如何從ng-repeat中的指令訪問控制器范圍?

[英]How to access to the controller scope from a directive inside ng-repeat?

我是AngularJS的新用戶,當我必須從ng-repeat中的指令訪問控制器中的變量時,我會陷入困境。 我認為它必須與范圍有關。

這是我的小提琴: http//jsfiddle.net/Zzb58/1/

'MyCtrl'范圍有兩個屬性:“items”,一個數組和“thing”,只是一個字符串。

function MyCtrl($scope) {
    $scope.items = [{id: 'item1'}, {id: 'item2'}];    
    $scope.thing = "thing";
}

所以,如果我創建一個指令並且我希望它能夠讀取數組的內容,那么這個指令非常有效:

<div my-directive ng-repeat="item in items" item='item'></div>
app.directive('myDirective', function () {
    return {
        restrict: 'AE',
        scope: {
            item: '=item',
        },
        template: '<div>{{ item.id }}</div>'
    }
});

HTML已正確刷新。

但是如果我嘗試從指令中訪問“thing”變量,它總是被讀作“未定義”。

app.directive('myDirective', function () {
    return {
        restrict: 'AE',
        scope: {
            item: '=item',
            thing: '='
        },
        template: '<div>{{ item.id }} - Here is not the {{thing}}</div>'
    }
});

我認為問題必須與ng-repeat中創建的范圍子項相關,或者變量未正確綁定。

但是,如果我在模板中使用$ parent.thing,則讀取變量並對其進行正確計算,但我不知道該$ parent是否為ng-repeat范圍或“MyCtrl”范圍。

1)我做錯了什么?

2)為什么需要將ng-repeat中讀取的“item”元素作為HTML元素的屬性? 我首先想到“items”在父范圍內,所以當創建指令的隔離范圍時,我只需要執行類似“items:'='”的操作。

通過為其分配對象,可以創建隔離范圍。 如果設置scope : true ,則可以像在示例中一樣使用它,如果不是,則必須將其作為屬性傳遞,就像使用item

http://jsfiddle.net/Zzb58/2/

有關不同范圍模式的說明,您可以閱讀本頁的指令部分: https//github.com/angular/angular.js/wiki/Understanding-Scopes

一般情況下,尤其是在使用繼承的范圍值時,我還強烈建議使用具有屬性集的對象,而不是簡單的字符串變量,因為這可能會導致整個范圍內的分離,這是由於原型繼承的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM