2013-09-05 116 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/

相关问题