angularjs - 理解 Angularjs 中的 'directive' 范例

标签 angularjs directive

我一直在思考 Angularjs 中的指令就像 ASP.Net 中的用户控件一样,也许我的想法是错误的。

用户控件允许您将一堆功能封装到一个小部件中,该小部件可以放置到任何页面的任何位置。父页面不必向小部件提供任何内容。我很难得到指示来做任何类似的事情。假设我有一个应用程序,一旦用户登录,我就会在某处的全局变量中保留用户的名字/姓氏。现在,我想创建一个名为“loggedinuser”的指令并将其放入我想要的任何页面中。它将呈现一个简单的 div,其中包含从该全局变量中提取的登录用户的名称。我该如何做到这一点,而不必让 Controller 将该信息传递到指令中?在我看来,我希望该指令的用法看起来像 <登录用户/>

这可能吗?

最佳答案

我想你可以粗略地将指令总结为“将一堆功能封装到一个小部件中的东西,可以将其放入任何页面的任何位置”,但它的含义远不止于此。指令是一种通过创建新标签来扩展 HTML 的方法,允许您编写更具表现力的标记。例如,不要写 <div>还有一堆<li>为了创建评级控件,您可以使用新的 <rating> 来将其包装起来。标签。或者,代替大量 <div> s,和<span>以及诸如此类的东西来创建选项卡式界面,您可以实现一对指令,例如 <tab><tab-page> ,并像这样使用它们:

<tab>
  <tab-page title="Tab 1"> tab content goes here </tab-page>
  <tab-page title="Tab 2"> tab content goes here </tab-page>
</tab>

这就是指令增强 HTML 的真正力量。这并不意味着您应该只创建“通用”指令;您可以而且应该针对您的应用程序制作特定的组件。所以,回到你的问题,你可以实现 <loggedinuser>标签来显示登录用户的名称,而不需要 Controller 向其提供信息。但你绝对不应该为此依赖全局变量。 Angular 的方法是使用服务来存储该信息,并将其注入(inject)指令中:

app.controller('MainCtrl', function($scope, userInfo) {
  $scope.logIn = function() {
    userInfo.logIn('Walter White');
  };

  $scope.logOut = function() {
    userInfo.logOut();
  };
});

app.service('userInfo', function() {
  this.username = ''
  this.logIn = function(username) {
    this.username = username;
  };
  this.logOut = function() {
    this.username = '';
  };
});

app.directive('loggedinUser', function(userInfo) {
  return {
    restrict: 'E', 
    scope: true,
    template: '<h1>{{ userInfo.username }}</h1>',
    controller: function($scope) {
      $scope.userInfo = userInfo;
    }
  };
});

笨蛋here .

Angular dev guide on directives如果您想开始创建强大的、可重用的指令,这是一个必去的地方。

关于angularjs - 理解 Angularjs 中的 'directive' 范例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106444/

相关文章:

javascript - 使用 AngularJS 过滤表

javascript - AngularJS UI 路由器 : ui-sref and directive

javascript - AngularJS 指令要求父指令不起作用

javascript - 如何动态更改当前菜单元素AngularJS的标题(指令中的模板)

angularjs - 如何在使用 angular cli 创建的项目中集成 angular2-materialize

angularjs - 如何在模板中设置范围?

javascript - Angular $q.defer() 返回 Object{then : function}

delphi - 基于 Delphi 2009 中的编译器指令的条件编译

javascript - AngularJS : Directive not picking up attribute

angularjs - 使用 ng-repeat 中的索引设置 ngmodel 的值