2015-04-01 94 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