Angular js 中的控制器和指令有什么区别?

2024-02-19

我是 Angular js 的初学者。我正在努力理解 Angular js 中控制器和指令之间的确切区别。


这里发生的事情有点太多,无法完全解释每一个,所以我将尝试对每一个进行简短的解释并举一个例子。

控制器

使用控制器来处理视图的逻辑并分配要在视图中显示的数据。例如,如果在您的应用程序中,您有一个名为“所有用户”的页面,您想要显示用户列表,请定义一个用户数组并将其附加到$scope控制器中的对象。

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

myApp.controller('allUsersController', ['$scope', function($scope) {
  $scope.users = [
    { name: "User 1", id: 1},
    { name: "User 2", id: 2},
    { name: "User 3", id: 3}
  ];
}]);

将 users 数组附加到范围允许您从视图访问此数据。所以现在在视图中你可以使用NG-重复 https://docs.angularjs.org/api/ng/directive/ngRepeat输出用户列表:

<ul>
 <li ng-repeat="user in users">{{user.name}}</li>
<ul>

指令

指令主要用于两件事:

  1. 创建可重用组件
  2. 操作 DOM

指令一开始使用起来很棘手,但非常强大,文档中的这一声明是它们如此强大的原因:

指令是 DOM 元素上的标记(例如 属性、元素名称、注释或 CSS 类)告诉 AngularJS HTML 编译器 ($compile) 将指定的行为附加到该 DOM 元素(例如通过事件监听器),甚至转换 DOM 元素及其子元素。

主要的一点是,指令允许您将特定的逻辑/行为附加到特定的element,因为控制器通常只允许您将逻辑附加到页面/视图。

假设在前面的示例中,我们想要添加一些可以在用户列表中完成的操作,可能是喜欢和不喜欢按钮。我们可以像这样创建喜欢和不喜欢按钮:

JS

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

myApp.controller('allUsersController', ['$scope', function($scope) {
  $scope.users = [
    { name: "User 1", id: 1, like: 0},
    { name: "User 2", id: 2, like: 0},
    { name: "User 3", id: 3, like: 0}
  ];

  $scope.like = function(user){
    user.like++;
  }

  $scope.dislike = function(user){
    user.like--;
  }
}]);

HTML

<ul>
 <li ng-repeat="user in users"> 
   {{user.name}}
   <button ng-click="like(user)">LIKE</button>
   <button ng-click="dislike(user)">DISLIKE</button> 
 </li>
<ul>

相当简单,我们在控制器中添加喜欢/不喜欢的方法,以增加/减少用户的喜欢数量。这段代码可以正常工作,但是如果我想在不同的视图中创建另一个用户列表怎么办?假设您有 3 个不同的视图,其中包含用户列表:“所有用户”、“我的朋友”和“推荐用户”,所有 3 个视图都会有一个具有相同操作(喜欢或不喜欢)的用户列表,但显示的用户是每个都不同。我们想要使用我们在我们的代码中定义的相同的喜欢/不喜欢方法allUsersController但我们处于不同的视图上,因此我们无法访问它们,因此您必须将相同的代码复制到其他视图的控制器中,在我们的示例中可能看起来不是什么大问题,但随着应用程序变得更大、更复杂这变得非常乏味且难以维护。

这就是指令发挥作用的地方,您可以在指令中定义它,而不是在控制器中分配每个用户项背后的逻辑:

app.directive('userItem', function() {
return {
    template: '<div>{{userData.name}} <button ng-click="like()">Like</button> <button ng-click="dislike()">Dislike</button>',
    scope: {
      userData: "="
    },
    link: function(scope, element, attrs) {
      scope.like = function(){
       scope.userData.like++;
      }

      scope.dislike = function(){
       scope.userData.like--;
      }
    }
}
});

在你的html中:

<div class="user_list>
   <user-item ng-repeat="user in users" user-data="user"></user-item>
</div>

通过使用user-item现在,您可以在应用程序中的任何位置创建用户列表,而无需重新定义每个用户的逻辑。您会注意到,这也稍微清理了我们的 html,并节省了很多重复代码的时间。该指令将您的 html 和 js 包装成reusable成分。

EDIT:关于我们如何将用户数据传递给指令,这与指令中的隔离范围有关,您可以阅读有关内容here http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-2-isolate-scope。基本思想是,它将指令的范围与父范围(在我们的例子中为 allUsersController)隔离,这样做是为了避免两个范围中的数据之间出现不必要的冲突并促进可重用性。但同时我们希望控制器与指令共享一些数据,因此我们通过隔离范围“戳一个洞”以允许某些内容进入,在我们的例子中是userData在指令范围内定义。

您可以访问指令文档 https://docs.angularjs.org/guide/directive并向下滚动以隔离范围以获取更多示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular js 中的控制器和指令有什么区别? 的相关文章

  • 如何创建一个非单例的 Angular JS 服务?

    因为每个服务都是单例 调用 injector get 每次仍然给我相同的实例 如何在另一个服务中使用一个服务的多个实例 请记住 我的非单例类的声明不得污染全局命名空间等 我的示例如下 我希望 injector get serviceCall
  • 在 Web 应用程序上同时运行两个版本的 (twitter) bootstrap

    我目前已经开始尝试使用 bootstrap 和 angularjs 进行客户端开发 我收到了一项任务 为我们的网站 一个 angularjs 应用程序 制作一个或多或少独立的功能 并且一直在研究它 但注意到我学到的引导函数不起作用 经过检查
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • Jasmine 单元测试不等待承诺解析

    我有一个有角度的服务 它具有像这样的异步依赖项 function angular module app factory myService q asyncService function q asyncService var myData
  • 通过查询字符串传递“Bearer”时 SignalR 身份验证失败

    我想在 SignalR 中启用身份验证 而服务器托管在 ASP NET WebAPI 中 我使用 OAuth Bearer 身份验证 客户端是 AngularJS 在客户端 我最初通过 HTTP 标头传递 Bearer 令牌 它与 WebA
  • 使用 Angularjs,$http 在 Microsoft Edge 中发布返回响应错误

    好吧 当我开发一个管理页面进行测试时 Microsoft Edge 中出现了一个奇怪的问题 这是从loginCtrl js服务器获取响应的部分源代码 http method POST url Define apiUrl admin logi
  • 如何与 ng-class 中的字符串进行比较?

    这条线似乎不适合我 Sort By a href Alphabetical a 我是否必须以某种方式转义 orderProp title 中的 title 在我的控制器中 scope orderProp title scope setOrd
  • 平静的 POST 响应的“最佳”实践

    所以这里没有什么新内容 我只是想得到一些澄清 似乎在其他帖子中找不到任何澄清 我正在平静地创建一个新资源 说 books POST 与身体 title The Lion the Witch and the Wardrobe author C
  • AngularJs 路由提供者 404

    下面的代码来自 AngularJs 教程 我稍作修改 我希望从 url 中删除哈希值 我实际上成功了 但现在我有其他问题 当我使用链接本地主机时 它工作得很好并将我重定向到本地主机 电话 但万一我尝试直接链接 localhost phone
  • 取消嵌套 ng-click 调用之间的事件传播的最佳方法是什么?

    这是一个例子 假设我想要像很多网站一样有一个图像叠加层 因此 当您单击缩略图时 整个窗口上会出现黑色覆盖层 并且图像的较大版本位于其中的中心 单击黑色覆盖层可将其关闭 单击图像将调用显示下一张图像的函数 html div class ove
  • AngularJS:ng-model 未绑定到 ng-checked 复选框

    我在问这个问题之前提到过这一点 AngularJs 不将 ng checked 与 ng model 绑定 https stackoverflow com questions 14226439 angularjs doesnt bind n
  • 角度剑道下拉

    我正在对许多组件使用 Angular kendo ui 但遇到了一个我似乎无法解决的问题 我有以下角度选择 它工作正常并将所选值正确绑定到 ng model
  • AngularJS 将 ui-select 包装在自定义指令中

    我正在尝试将 ui select 包装在自定义指令中 https github com angular ui ui select https github com angular ui ui select this adminv2 dire
  • 需要参考$log.log调用行号

    当我使用 Angular log 服务时 控制台中的所有行都会显示对 angular js 5687 的引用 而不是我调用 log log 函数的行 如何获得对我调用 log 的行的引用 另外 我有自己的围绕 log 的服务 如何引用对我的
  • AngularJS 中的重定向状态

    这是状态配置 angular module grabhutApp config function stateProvider urlRouterProvider stateProvider ACCOUNT state account abs
  • 使用 ng-if 内容短暂呈现然后消失

    我的页面上有一些内容包含在 ng if 中 如下所示 div class text danger p strong Message displayed to User strong p div 然后在我的 Angular js 控制器中我有
  • Angular JS未知提供者错误

    删除 Bower components 并清理缓存后 我使用 Bower install 重新安装了依赖项 该应用程序无法加载并出现以下错误 未捕获的错误 injector unpr 未知提供程序 forceReflowProvider 这
  • 在 Chrome 扩展中使用页面的 Angular JS

    我有一个 HTML 页面 其中有一些使用 Angular 配置的 DOM 现在我正在构建一个 chrome 扩展来修改文本框中的值 element value newValue不起作用 因为文本框是用 Angular 设计的 在阅读了一些资
  • 未捕获的引用错误:在 karma start karma.conf.js 上未定义 require

    使用 Karma 和 Jasmine 对 Rails 应用程序的 Angular 前端进行单元测试 看来我已经做了所有已知的事情来解决这个错误 并且我的 package json 中留下了一百万个依赖项 这是我的 Karma conf js
  • AngularJS 中“href”和“ng-href”的区别

    我都用过href and ng href我看不出它们之间的区别 为什么 Angular 有ng href属性 什么时候应该使用它 从文档中 https docs angularjs org api ng directive ngHref 使

随机推荐