2013-07-29 60 views
59

我試圖讓我的兩個元素切換,所以如果一個元素被點擊,它將刪除我的類的所有引用,並將其應用於它的自我。有任何想法嗎?Angular.js如何更改單擊元素css類並刪除所有其他

<span id="1" ng-style="my-class" ng-click="tog=my-class"></span> 

<span id="2" ng-style="my-class" ng-click="tog=my-class"></span> 

乾杯!

+0

請提供示例。提供 –

+0

,忘記縮進它。 – TheNickyYo

+0

你的意思是它從所有其他元素中刪除風格?然後將樣式應用於自己? – Rastapopulous

回答

133

創建一個名爲的selectedIndex一個scope屬性,以及itemClicked功能:

function MyController ($scope) { 
    $scope.collection = ["Item 1", "Item 2"]; 

    $scope.selectedIndex = 0; // Whatever the default selected index is, use -1 for no selection 

    $scope.itemClicked = function ($index) { 
    $scope.selectedIndex = $index; 
    }; 
} 

然後我的模板會是這個樣子:

<div> 
     <span ng-repeat="item in collection" 
      ng-class="{ 'selected-class-name': $index == selectedIndex }" 
      ng-click="itemClicked($index)"> {{ item }} </span> 
</div> 

僅供參考$指數是一個神奇ng-repeat指令中可用的變量。

您也可以在指令和模板中使用同一個樣本。

這裏是一個工作plnkr:

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

+3

看看我發佈的內容,它很相似,但使用指令而不是設置控制器中的變量。另外我沒有使用$ index,但如果您使用ng-repeat,那將是最好的方法。在我的例子中,我不使用ng-repeat,所以如果你不能訪問$ index,這是一種方法。 – Rastapopulous

+0

偉大的解決方案,你做了我的一天! – davidrl1000

+0

在控制器數組中定義UI文本對我來說不正確,除非你真的在處理狀態。我還建議您查看Rastapopulous和DotDotDot提供的解決方案。 –

37

你有沒有嘗試ng類的條件就像這裏:http://jsfiddle.net/DotDotDot/zvLvg/

<span id='1' ng-class='{"myclass":tog==1}' ng-click='tog=1'>span 1</span> 
    <span id='2' ng-class='{"myclass":tog==2}' ng-click='tog=2'>span 2</span> 
+1

如果你有100個元素,我不認爲這是可擴展的。 –

+47

你說你想切換2個元素,下次要求可擴展的東西;) – DotDotDot

+1

我喜歡這個解決方案,但我不知道如何默認選擇 – perrohunter

11

對我來說,這似乎是最好的解決辦法是使用一個指令;控制器不需要知道視圖正在更新。

的Javascript:

var app = angular.module('app', ['directives']); 

angular.module('directives', []).directive('toggleClass', function() { 
    var directiveDefinitionObject = { 
     restrict: 'A', 
     template: '<span ng-click="localFunction()" ng-class="selected" ng-transclude></span>', 
     replace: true, 
     scope: { 
      model: '=' 
     }, 
     transclude: true, 
     link: function (scope, element, attrs) { 
      scope.localFunction = function() { 
       scope.model.value = scope.$id; 
      }; 
      scope.$watch('model.value', function() { 
       // Is this set to my scope? 
       if (scope.model.value === scope.$id) { 
        scope.selected = "active"; 
       } else { 
        // nope 
        scope.selected = ''; 
       } 
      }); 
     } 
    }; 
    return directiveDefinitionObject; 
}); 

HTML:

<div ng-app="app" ng-init="model = { value: 'dsf'}"> <span>Click a span... then click another</span> 

<br/> 
<br/> 
<span toggle-class model="model">span1</span> 

<br/><span toggle-class model="model">span2</span> 

<br/><span toggle-class model="model">span3</span> 

CSS:

.active { 
    color:red; 
} 

我有一個小提琴是demonstrates.點擊一個指令時的想法是,一個函數被調用在爲當前作用域ID設置變量的指令上。那麼每條指令也會觀察到相同的值。如果範圍ID匹配,則使用ng-class將當前元素設置爲活動狀態。

使用指令的原因是您不再依賴控制器。事實上,我根本沒有控制器(我確實在名爲「model」的視圖中定義了一個變量)。然後,您可以在項目中的任何位置重用此指令,而不僅僅是在一個控制器上。

+0

我可以在ng-repeat中使用這個嗎? greetz –

7

通常與Angular你會輸出這些跨度使用ngRepeat指令和(就像你的情況)每個項目都會有一個ID。我知道在所有情況下都不是這樣,但通常情況下,從後端請求數據 - 數組中的對象往往具有唯一的標識符。

您可以使用此ID來簡化列表中項目的類別切換(請參閱下面的plunkr或代碼)。

使用對象ID也可以消除由於在Angular中進行排序而導致$ index(在其他答案中描述)混亂時出現的不良影響。

例Plunkr:http://plnkr.co/edit/na0gUec6cdMABK9L6drV

(如果person.id等於$ scope.activeClass基本應用。主動選擇類 - 這是我們設置當用戶點擊一個項目

希望這幫助別人,我發現在納克級的表現是非常有用的!

HTML

<ul> 
    <li ng-repeat="person in people" 
    data-ng-class="{'active-selection': person.id == activeClass}"> 
    <a data-ng-click="selectPerson(person.id)"> 
     {{person.name}} 
    </a> 
    </li> 
</ul> 

JS

app.controller('MainCtrl', function($scope) { 
    $scope.people = [{ 
    id: "1", 
    name: "John", 
    }, { 
    id: "2", 
    name: "Lucy" 
    }, { 
    id: "3", 
    name: "Mark" 
    }, { 
    id: "4", 
    name: "Sam" 
    }]; 

    $scope.selectPerson = function(id) { 
    $scope.activeClass = id; 
    console.log(id); 
    }; 
});  

CSS:

.active-selection { 
    background-color: #eee; 
} 
2

我只更改/刪除類:

function removeClass() { 
        var element = angular.element('#nameInput'); 
      element.removeClass('nameClass'); 
    }; 
1

HTML

<span ng-class="{'item-text-wrap':viewMore}" ng-click="viewMore= !viewMore"></span> 
+6

給你的答案添加一些評論 – kvorobiev

相關問題