1

我有一個JavaScript網格庫slickgrid指令。定義隔離範圍時的指令行爲更改

http://plnkr.co/edit/KWZ9i767ycz49hZZGswB?p=preview

我想要做的是通過選定的行備份控制器。所以我想使用獨立的作用域(使用'=')來獲得控制器和指令之間的雙向綁定。如果我定義的指令沒有任何類型的範圍聲明

一切正常。

<slickgrid id="myGrid" data="names" selected-item="selectedItem"></slickgrid> 

app.directive('slickgrid', function() { 
    return { 
    restrict: 'E', 
    replace: true, 
    //scope: { 
    // selectedItem: '=' 
    //}, 
    template: '<div></div>', 
    link: function($scope, element, attrs) { 
    ... 
    var redraw = function(newScopeData) { 
    grid.setData(newScopeData); 
    grid.render(); 
}; 
$scope.$watch(attrs.data, redraw, true); 

但是,如果我去掉上面(19-21行中app.js)的線條,它看起來像$ $範圍觀看attrs.data對象的手錶正在調用重繪,但attrs.data被傳入爲未定義。

我分析可能是錯的,但我不知道爲什麼定義的範圍將導致此。有人可以解釋爲什麼可能嗎?

.nathan。

回答

1

如果定義了分離的範圍,然後在你的指令任何$腕錶將尋找任何attrs.data計算爲你的分離範圍。 attrs.data計算得到字符串names,所以$手錶找$scope.names您的分離範圍,這不存在。 (如果沒有隔離範圍,該指令使用了相同的範圍內MainCtrl和$scope.names存在那裏。)

要使用分離的範圍,你需要定義彼此隔離範圍財產names經過:

scope: { 
    selectedItem: '=', 
    data: '=' 
}, 
... 
$scope.$watch('data', redraw, true); 

HTML可以保持不變。

+0

謝謝,我能夠得到這個工作。但是,我仍然不清楚爲什麼數據範圍需要封裝在蜱中。現在我必須弄清楚爲什麼{{selectedItem}}在指令中選擇一個新行時沒有更新! – nathasm 2013-03-16 01:25:24

+0

@nathasm,如果[$ watch](http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$watch)的第一個參數是一個字符串,那麼它將根據作用域進行評估,就像'ng-click ='someProperty = 22''或'ng-model ='someProperty''或'ng-show =「showIt」'。要讓{{selectedItem}}'更新:'$ scope.selectedItem = item; $範圍。$適用()'。 [Plunker](http://plnkr.co/edit/SJUJkgb4GgDwNlnJElBk?p=preview)。 – 2013-03-16 03:34:10