2014-06-17 34 views
0

我需要在幾個地方訂​​購表格行。由於只顯示了一個「主」表,因此我決定使用一個相當全局變量$scope.n.order(其中n是我收集的重要的n持續變量)。如何從指令中訪問「正確」範圍?

的,而重複的方法工作得很好:

<th ng-click="n.order=['created','id']">Created</tr> 
... 
<tr ng-repeat="x in m.items | orderBy: n.order"> 

因爲我想一些order類添加到排序列(也許更多這樣的事情),我想創建一個相應的指令,這樣我可以寫(我不知道)。我唯一的問題是,該指令無法訪問正確$scope ...在調試器中,我可以看到,我將不得不訪問$scope.$parent.$parent.$parent或類似。有什麼正確的方法來實現它?我不知道控制器的名稱,所以我不能使用require。我只知道它是「我的主」控制器(負責整個頁面)。


根據請求,我添加了一些代碼,但恐怕沒有解釋任何問題,因爲問題只是訪問適當的範圍。適當的範圍可以被定義爲具有我需要的變量的範圍。 ;)

.directive('myOrder', function($location) { 
    function link($scope, element, attr) { 
     var list = $scope.myOrder.split(/,/); 
     element.on('click', function() { 
      $scope.n.order = list; 
     }); 
    }; 

    return { 
     restrict: 'A', 
     // I've tried also `scope: false` and leaving it out and whatever... 
     scope: { 
      myOrder: "@", // this works 
      n: "=" // this doesn't as `n` is many scopes away 
     }, 
     link: link 
    }; 

其實,我的最後一句話給我帶來了一個 「解決方案」。跟隨父母直到適當的範圍。它的作品,但感覺完全哈克...

+0

一些更多的代碼可以很好地工作 – maurycy

+1

(1)不要忘記在'element.on'處理程序中添加'$ scope。$ apply()'。 (2)你如何指定'n'作用域參數,它不起作用?從'創建','n' * NOT * defined - 並且您不能指望它能夠工作!類似於'創建'可以這樣做...... –

+0

@NikosParaskevopoulos 1.感謝'$ scope。$ apply()'。 2.名爲'$ scope.n' *的變量* always *存在於* some *封閉範圍中,因爲我總是在每個「page-controller」中創建它。 3.'n =「n」'可能會創建一個新的變量,無論如何,我想保持指令的使用盡可能短。 – maaartinus

回答

0

我看到我困惑的事情(再次)。我應該決定是否想要一個孤立的範圍,或者繼承,或者根本沒有。其實,我不需要範圍,因爲我的指令作爲

<th my-order=created>Created</th> 

應該接觸到的哈希封裝元素的範圍稱爲n並設置

`n.myOrder = "created" 

這是哈克並且如果不能重複使用多個這樣的命令,但是對我來說可以,因爲總是有一個主表需要排序,所以我使用了一個排序列變量名的約定(將這個名稱作爲參數傳遞是需要的時候顯而易見的擴展) 。分離的範圍是好的,我需要的是

$scope.$parent.n.order = list; 

使用調試我看不出有$scope.$parent,這導致我誤入歧途。實際上,它並不存在,但它在原型上得到了繼承,所以一切都很好。