2015-04-01 100 views
0

我有一個儀表板式小部件容器,它包含一個標題面板。 我具有其中實現了以下功能的標題面板幾個圖標:在span元素中使用AngularJS ng-class

1)崩潰插件 2)最大化插件 3)發射窗口小部件設置 4)靠近插件

項目#2是一個其中我遇到了麻煩。點擊時,我需要用「還原」圖標替換最大化圖標。

使用摺疊行爲作爲指導,我可以使用ng-class來切換圖標,但我的ng-click將會不同,因爲我在該指令中調用了一個方法。

<div class="widget-header panel-heading"> 
 
\t <h3 class="panel-title"> 
 
\t \t <span class="widget-title" ng-dblclick="editTitle(widget)" ng-hide="widget.editingTitle">{{widget.title}}</span> 
 
\t \t <form action="" class="widget-title" ng-show="widget.editingTitle" ng-submit="saveTitleEdit(widget)"> 
 
\t \t \t <input type="text" ng-model="widget.title" class="form-control"> 
 
\t \t </form> 
 
\t \t <span class="label label-primary" ng-if="!options.hideWidgetName">{{widget.name}}</span> 
 
\t \t <span ng-click="removeWidget(widget);" class="glyphicon glyphicon-remove" ng-if="!options.hideWidgetClose"></span> 
 
\t \t <span title="config" ng-click="openWidgetSettings(widget);" class="glyphicon glyphicon-cog" ng-if="!options.hideWidgetSettings"></span> 
 

 
\t \t <span title="maximize" ng-show="widget.gadgetConfigured" ng-click="maxResizer($event)" class="glyphicon" ng-class="{'glyphicon-resize-full': !widget.maximized, 'glyphicon-plus': widget.maximized}" ></span> 
 

 
\t \t <span title="collapse" ng-show="widget.gadgetConfigured" ng-click="widget.contentStyle.display = (widget.contentStyle.display === 'none' ? 'block' : 'none')" class="glyphicon" ng-class="{'glyphicon-plus': widget.contentStyle.display === 'none', 'glyphicon-minus': widget.contentStyle.display !== 'none' }"></span> 
 
\t </h3> 
 
</div> 

,這裏是指令的處理方法最大化:

 $scope.maxResizer = function (e) { 
 
      // TODO: properly restore the window to original position..  
 

 
      var widget = $scope.widget; 
 
      var widgetElm = $element.find('.widget'); 
 
      
 
      var ht_diff = 200; // height differential    
 

 
      widget.setWidth(window.innerWidth); 
 
      $scope.widget.setHeight(window.innerHeight-ht_diff); 
 

 
      $scope.$emit('widgetChanged', widget);    
 
      $scope.$apply(); 
 
      
 
      $scope.$broadcast('widgetResized', { 
 
       width: window.innerWidth, 
 
       height: window.innerHeight-ht_diff 
 
      }); 
 
      // this will refresh the chart width within the container - 03/30/2015 BM: 
 
      kendo.resize($(".k-chart")); 
 
            
 
      var pixelHeight = widgetElm.height(); 
 

 
      // kendo chart - refreshes chart height within the container - 03/30/2015 B 
 
      var chart = widgetElm.find('.k-chart').data("kendoChart"); 
 
      if (chart != undefined) { 
 
       chart.setOptions({ chartArea: { height: pixelHeight - (pixelHeight * .10) } }); 
 
       chart.resize($(".k-chart")); 
 
      } 
 
      widget.maximized = true; 
 
     }

正如你所看到的,我有一個屬性設置爲真/假widget.contentStyle.maximized

有人能幫我弄清楚我要去哪裏錯了嗎?也就是說,最大化圖標仍然存在,因此不會更改爲加號圖標。

+1

你在哪裏設置'widget.contentStyle.maximized'?如果這是一個布爾值,則不能將它與字符串「true」和「false」匹配,只需刪除這些雙引號即可。或者,更好的方法是通過一個真實/有益的檢查來改變你的ng類:'ng-class =「{'glyphicon-resize-full':!widget.contentStyle.maximized,'glyphicon-plus':widget.contentStyle.maximized }「' – floribon 2015-04-01 21:33:47

+0

我像往常一樣只是一個白癡。它不是'widget.contentStyle.maximized'。它只是'widget.maximized' – 2015-04-01 21:52:23

+0

@floribon - 你的真理聲明對角度更有意義。這不是最終的答案,但非常有幫助。我的問題是一個真正的錯誤。再次感謝您的指導,因爲當我得到您的意見時,它總是有幫助的。 – 2015-04-01 21:54:27

回答

3

我構建了一個簡單的解決方案來處理根據狀態切換圖標的相同UI功能。我沒有使用任何JavaScript處理實際調整大小,我使用CSS類來更改定位樣式。

關於$ parent部分,我不得不使用它來引用控制器範圍,因爲我的檢查是使用ng-hide和ng-if創建$ scopes,使用$ parent可以確保我引用控制器$ scope變量。

例如,您的情況下,ng-click="maxResizer($event); $parent.ifFullscreen"可以使您的現有代碼和類切換邏輯一起工作。

<a ng-click="$parent.isFullscreen = !$parent.isFullscreen;"> 
    <i class="glyphicon" 
     ng-class="'glyphicon-resize-' + ($parent.fullscreenTable ? 'small' : 'full')" 
     tooltip="{{$parent.fullscreenTable ? 'restore' :'fullscreen'}}" 
     tooltip-placement="{{$parent.fullscreenTable ? 'left' : 'top'}}"></i> 
</a> 

我已將您的示例代碼和應用我的建議給它給你一個活的工作示例。 http://plnkr.co/edit/zYq5MtwP54rr2L5IGw4k?p=preview

這是唯一我行實際改變

<span title="maximize" ng-show="widget.gadgetConfigured" ng-click="maxResizer($event); widget.contentStyle.maximized = !widget.contentStyle.maximized" class="glyphicon" ng-class="'glyphicon-resize-' + (widget.contentStyle.maximized ? 'small' : 'full')" ></span> 
+0

@bob你可以在我的更新中檢查Plunker嗎?讓我知道這是否能讓您深入瞭解UX設計的解決方案。我忽略了實際調整大小,因爲我相信你有這個工作。我專注於切換圖標。 – 2015-04-01 22:18:31

+0

@bob剛剛看到您關於更新瀏覽器標題值時最大化的評論。在這種情況下,我認爲無論是簡單的Controller $ scope方法還是一個指令都可以處理這個問題。你要做的就是將所有的狀態存儲在「widget」$ scope變量中,我假設這是在ng-repeat中。您可以在處理以您需要的方式更新UI的方法中使用此對象。讓我知道如果你想看到每個 – 2015-04-01 22:21:17

+0

@bob的演示我總是推薦KISS,用它來處理標題,我將$ rootScope添加到你的控制器中,並在你的maxResizer方法中改變$ rootScope中的變量標題,示例可以在這裏表示http://stackoverflow.com/questions/12506329/how-to-dynamically-change-header-based-on-angularjs-partial-view – 2015-04-01 22:23:38