将BootstrapJS和AngularJS结合使用以及为啥不用jQuery

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将BootstrapJS和AngularJS结合使用以及为啥不用jQuery相关的知识,希望对你有一定的参考价值。

参考技术A  Bootstrap 和 Angular 都是人们大量使用的工具。在很多项目中,它们需要一起使用。为什么不呢?他们已经改变了CSS和JS的开发方式,让前端既成为令人难以置信的工具。

  但是,把它们放在一起使用还有一些问题,特别是当你试图在Angular的项目中引入Bootstrap javascript组件时,会是一个问题。当建立了Angular的项目,##你不应该添加完整的jQuery库##。 jQlite已经包含在Angular中的,所有jQuery必要的功能它都有。这是因为把jQuery添加到Angular的项目将很难让你完全掌握Angular的核心优势和数据绑定的力量。

  比如你想在某种程度上改变View视图,一个很好的做法是通过Angular所绑定的data数据来改变。我们写这篇文章的目标就是为了,学习用jQuery和Angular通过不同的手段达到相同的目的。

  Bootstrap JavaScript和Angular问题

  这个问题可以追溯到,你不应该在你的Angular项目中使用jQuery的原则。jQuery操作视图的方法与Angular操纵数据的方法会起冲突。

  为什么你不应该使用jQuery

  您使用jQuery操作数据抓住并注入到DOM的方式基本上基于事件。当我们使用Bootstrap JavaScript组件时,比如一个按钮,我们需要“单击此按钮时,设置此按钮为激活状态”。并将这种设置添加入新加的按钮中。通过添加 .active 类和检查input(如果你的按钮是一个input)为实现。

  在Angular中,操纵数据不是通过抓取和注入。一般通过数据绑定来实现,野蛮抓取注入数据。也能够改变每个组件的状态,不过在切换时就会暴露出问题。

  这就是为什么我们不能直接用Bootstrap的JavaScript。它依赖于jQuery我们不希望jQuery的破坏我们的Angular项目。如果我们试图绑定变量到组件,它无法工作。

  解决方案: UI Bootstrap

  那么该如何解决?我们从Angular得知,我们需要将数据绑定到一个特定的组件,我们应该建立一个directive 指令。这将让我们的Angular网站,更关注数据的变化。

  该解决方案是一种被称为UI Bootstrap 的项目。这是由Angular UI团队开发的,增加了许多Angular的扩展组件。UI Bootstrap不使用jQuery; 它为每个Bootstrap JS组件添加了内置指令(directives)。

  对于UI Bootstrap(非BootstrapJS)的要求是:

  没有jQuery的依赖
  依赖Angular
  依赖Bootstrap CSS文件

  就是这样。现在,我们要如何将它集成到我们的项目?

  我们的Angular应用

  让我们来看看我们需要些什么设置。如果你已经看过JavaScript代码,你会看到我们创建了一个Angular模块和控制器。然后,我们创建的按钮和折叠的变量。

  为此,下一步就是要拿到UI Bootstrap的文件,放到我们的项目中。那么我们能够在我们的Angular模块中导入ui.bootstrap。就这样,我们就能够获取需要模仿BootstrapJS组件的指令(directives )!

  // 创建 angular app 导入 ui.bootstrap
  angular.module('app', ['ui.bootstrap'])

  .controller('mainController', function($scope)
  
  // BUTTONS ======================

  // 设置数据
  $scope.bigData = ;
  
  $scope.bigData.breakfast = false;
  $scope.bigData.lunch = false;
  $scope.bigData.dinner = false;
  
  // COLLAPSE =====================
  $scope.isCollapsed = false;
  
  );

  现在,正确的使用方式是,当按下按钮时调整这些变量的值。

  使用UI Bootstrap按钮指令(Directive)

  通过UI Bootstrap文档 ,使用复选框按钮正确的方法是添加 ng-model 的定义对象,并添加 btn-checkbox 属性。下面是我们按钮的代码:

  <div class="btn-group" data-toggle="buttons">

  <label class="btn btn-primary" ng-model="bigData.breakfast" btn-checkbox>
  Breakfast
  </label>

  <label class="btn btn-primary" ng-model="bigData.lunch" btn-checkbox>
  Lunch
  </label>

  <label class="btn btn-primary" ng-model="bigData.dinner" btn-checkbox>
  Dinner
  </label>

  </div>

  现在,当我们点击按钮时,我们可以看到该模型的变化,就像我们希望的那样。

  使用UI Bootstrap折叠指令

  对于折叠,我们将基于isCollapsed变量的值打开和关闭面板。因此,我们将使用 ng-click="isCollapsed=!isCollapsed"。这将触发我们的isCollapsed变量从而切换面板。

  <div class="panel panel-default">
  <div class="panel-heading">
  <h4 class="panel-title">
  <a href="#" ng-click="isCollapsed = !isCollapsed">
  Collapsible Group Item #1
  </a>
  </h4>
  </div>
  <div collapse="isCollapsed">
  <div class="panel-body">Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
  </div>
  </div>
  </div>

  现在,我们两个组件都可以工作了!在美丽时尚的Angular中,设置一个变量,看着它影响一些视图。
参考技术B 爱上发了看见为了看是大国的

如何结合 AngularJS 和 Thymeleaf 模板

【中文标题】如何结合 AngularJS 和 Thymeleaf 模板【英文标题】:How to combine AngularJS and Thymeleaf templates 【发布时间】:2017-03-28 20:57:54 【问题描述】:

我正在将当前使用 Thymeleaf 的网页转换为使用 AngularJS。

我想转换包含 Thymeleaf 的后续块

<form th:action="@?deleteLog" th:object="$log" method="post" class="in-line">
    <input type="hidden" th:value="$log.vid_id" name="vid_id" />
    <input type="hidden" th:value="$log.id" name="id" />
    <button type="submit" class="btn btn-danger">Delete</button>
</form>

这些th:value 变量被传递给我的控制器类中的@PostMapping 方法,然后使用这些变量从我的数据库中删除一个条目。

如何使用 AngularJS 实现这一点?采取与我相同的方法

<form th:action="@?deleteLog" method="post" class="in-line">
    <input type="hidden" th:value="x.vid_id" name="vid_id" />
    <input type="hidden" th:value="x.id" name="id" />
    <input type="button" value="Remove" class="btn btn-danger" ng-click="removeRow(tableList.id)" />
</form>

removeRow() 函数成功地从 UI 中的表中删除了行,我只需要将 x.vid_idx.id 值发送到我的控制器类中的方法。

我显然没有使用正确的语法,因为我在尝试使用 Angular 时遇到了 th:value="x.id" thymeleaf 变量的解析错误。我也试过th:value="$x.id"'th:value="$x.id"

我无法在网上找到有关传递 Angular 变量的任何信息。这甚至可能吗?

【问题讨论】:

【参考方案1】:

您不应将 AngularJS(用于客户端 HTML 模板的 SPA 框架)与 Thymeleaf(用于服务器端 HTML 模板的库)混合使用。您应该选择在服务器或客户端上进行模板化并坚持下去。

将这两者结合起来根本没有意义。

【讨论】:

以上是关于将BootstrapJS和AngularJS结合使用以及为啥不用jQuery的主要内容,如果未能解决你的问题,请参考以下文章

如何结合 AngularJS 和 Thymeleaf 模板

将 AngularJS 与 PassportJS 结合时出现 CORS 问题

AngularJS - 将拖放与流程图相结合

htmlcss/bootStrapjs/Jqueryajax与json数据交互总结

结合 AngularJS 和 Laravel 路由

Angularjs列表项边距问题将ng-repeat元素与静态元素结合起来