2013-04-30 2 views
2

Я пытаюсь создать своеобразное меню с вкладками, используя ng-switch.AngularJS ng-switch-when выражение

Я установил вкладки в моих Ctrl (потоки) и следить за выбранной в данный момент один, как выбор:

app.controller("StreamCtrl", function($scope) { 
$scope.streams = [{ 
    title: 'latest', 
    icon: 'time', 
    data: "Hi, I'm data." 
}, { 
    title: 'popular', 
    icon: 'fire', 
    data: "Hi, I'm data too!" 
}]; 

$scope.selection = $scope.streams[0]; 

$scope.getCurrentStreamIndex = function(){ 
    // Get the index of the current stream given selection 
    return $scope.streams.indexOf($scope.selection); 
}; 

// Go to a defined stream index 
$scope.goToStream = function(index) { 
    if($scope.streams[index]) { 
     $scope.selection = $scope.streams[index]; 
    } 
}; 
}); 

И на мой взгляд (index.html), я использую нг-повтора, чтобы создать контейнер для каждой вкладки:

<section class="streams" ng-controller="StreamCtrl" ng-switch="stream.title == selection.title"> 
     <section class="stream" ng-switch-when="true" ng-repeat="stream in streams"> 
      {{stream.title}} 
      <div class="loaderContainer"><div class="loader"></div></div> 
     </section> 
    </section> 

проблема я бегу на это с моим нг-переключателя-, когда утверждение, потому что он не будет принимать выражение.

Если бы я мог установить ng-switch-when="{{stream.title}}", то, полагаю, я мог бы использовать ng-switch="selection.title", и все было бы хорошо.

Как бы структурировать выражение ng-switch, хотя оно соответствует динамически сгенерированному списку?

+1

в вашем "нг-переключатель", где «поток»? я вижу «выбор», определенный в вашем контроллере, но «поток» не определен до «ng-repeat», насколько я могу судить. – Jonah

+0

Мне не знакомо, когда ng-switch оценивает его выражение и в какой области он получает оценку. То, что вы видите, было тестом. Я надеялся, что это будет оценено в рамках ng-switch-when (также ng-repeat в этом случае), поэтому поток (из ng-repeat) может быть доступным объектом. –

+0

Не уверен на 100%, но я не думаю, что это так. Я бы попытался провести реструктуризацию с предположением, что «поток» будет недоступен, кроме как внутри оператора ng-repeat. – Jonah

ответ

3

Хорошо, проверить это, я думаю, что это должно дать вам достаточно, чтобы продолжать идти:

http://jsbin.com/okukey/1/edit

Новый HTML:

<div ng-controller="StreamCtrl"> 
    <section class="streams" ng-repeat="stream in streams"> 
     <section class="stream"> 
      {{stream.title}} 
      <div class="loaderContainer" ng-show="stream == selection"><div class="loader">SELECTED</div> 
     </section> 
    </section> 
    </div> 
+0

О, хорошо, поэтому вы отключили ng-переключатель с ng-show. Ага! Это работает. Большое спасибо. Я решил, что ng-switch просто не сработает, и должен быть другой способ сделать это. –

+0

@Jonah: более сжатым способом заменить «ng-switch» было бы вместо этого использовать 'ng-if', потому что он удаляет ложные приведенные элементы из DOM, как и' ng-switch-when'. 'ng-show' и' ng-hide' содержат элементы DOM, управляющие только их классами CSS, что означает, что они требуют больше ресурсов. Может быть незначительным, но не всегда. –

Смежные вопросы