2013-09-05 113 views
0

我有一個元素列表,我想要摺疊到一個點擊一個選定的元素。我無法讓控制器上的代碼刷新列表。我究竟做錯了什麼?我認爲改變$範圍將使視圖重新加載。控制器沒有重新加載更改後的視圖

我通過更改視圖中引用的$ scope變量來使其工作。所以我的猜測是,視圖上引用的變量的處理方式與其他$ scope屬性不同。是對的嗎?

AptListCtrl = ($scope) -> 
    console.log apt_selected 
    if $scope.apt_selected? 
     $scope.apts = [$scope.apt_selected] 
    else 
     $scope.apts = apts 
    $scope.aptClick = ($event, apt) -> 
     if $scope.apt_selected? 
      if $scope.apt_selected is apt 
       $scope.apt_selected = null 
      else 
       $scope.apt_selected = apt 
     else 
      $scope.apt_selected = apt 
     $('#selected_apt').html('Selected: ' + apt.title) 
     $scope.$watch('apt_selected', (newv, oldv, scope)-> 
      console.log 'new' 
      console.log newv 
      console.log 'old' 
      console.log oldv 
     ) 
     $scope.$digest() 




      <ul class="list-group" ng-controller = "AptListCtrl"> 
        <li class="list-group-item" ng-repeat = "apt in apts" 
        ng-click="aptClick($event, apt)" ng-model = "apt_selected"> 
        <a href="#">{{apt.marker_text}}</a> 
        </li> 
      </ul> 

回答

0

由於@JSager指出的那樣,你可以更好地利用的角度。假設'$ scope.apts'是一個項目數組,並且$ scope.apt_selected是一個點擊的項目,你在控制器中需要的很少。只需定義變量:

$scope.apts = { 
    list: ['apt 1','apt 2','apt 3'], 
    sel: null 
} 

注:我將您的變量更改爲一個對象,因爲ng-repeat創建了一個新的子範圍。在我的HTML下面,我使用'ng-click'來設置apts.sel的值。因爲你要在父範圍內設置一個var屬性的值,所以它可以工作,但是如果你試圖在'ng-repeat'中設置一個控制器var的值,它將不起作用。

你想要做的更多的是一種行爲。行爲最好在HTML中進行處理(如果需要,也可以使用指令)。你可以用'ng-show'和'ng-hide'(都帶有一個布爾值或可以計算爲布爾值的表達式)很容易地顯示/隱藏事情。這裏是實現這一目標的一種方法:

<ul> 
    <li ng-repeat="apt in apts.list" 
     ng-click="apts.sel = apt" 
     ng-show="apts.sel == null || apts.sel == apt"> 
     {{apt}} 
    </li> 
</ul> 

這裏是它的工作小提琴:http://jsfiddle.net/gklandes/24FDj/1/

相關問題