【问题标题】:Convert control to Angular Directive?将控制转换为 Angular 指令?
【发布时间】:2023-03-21 00:50:01
【问题描述】:

我们的网站上有这个按钮:

<button class="btn btn-primary" id="button-loading-example" 
      ng-click="progress.buttonLoading.load()" 
      ng-model="progress.buttonLoading" pb-button-progress
      type="button">Save</button>

与此相关的 ng-model,在控制器中(控制器为“进度”):

 _this.buttonLoading = {
  isLoading: false,
  text: 'Saving',
  load: function() {
    _this.buttonLoading.isLoading = true;
    $timeout(function() {
      _this.buttonLoading.isLoading = false;
    }, 2000);
  }
};

我正在尝试将此作为指令。我可以从我的元素中传递类和标签:

<pb-spinner-button ng-class-list="btn btn-primary">Save</pb-spinner-button>

我不知道如何连接(或简单地丢弃和取代)ng-model,更糟糕的是,我不知道在哪里挂接旧控制器中的“加载”功能。

我意识到旧的控制很可能是过度的,应该是指令,但我继承的人是指令厌恶的。

到目前为止,这是我的指令:

  (function() {

  'use strict';

  angular.module('app').directive('pbSpinnerButton', function() {
    return {
      restrict: 'E',
      require: 'ngModel',
      scope: {
        ngModel: '=',
        ngClassList: '@'

      },
      controller: 'SpinnerController',
      template: '<button class="{{ngClassList}}" ng-click="buttonLoading.load()" ng-model="buttonLoading" pb-button-progress type="button"><ng-transclude></button>',
      transclude: true,
      link: function postLink(scope, element, attrs) {
      }
    };
  })


  .controller('SpinnerController', function($timeout) {

    var _this = this;
    _this.buttonLoading = {
      isLoading: false,
      text: 'Saving',
      load: function() {
        _this.buttonLoading.isLoading = true;
        $timeout(function() {
          _this.buttonLoading.isLoading = false;
        }, 2000);
      }
    };

  });

})();

根据要求,这里是一个 plunkr:http://plnkr.co/edit/EOekzFdUDrArZ4dkolLl?p=preview

【问题讨论】:

  • 没有模型被传递给属性,但是因为它是一个按钮,你需要 ng-model 吗? .. 在 plunker 中创建一个演示。
  • 这是我不明白的一部分。这是一个笨蛋plnkr.co/edit/EOekzFdUDrArZ4dkolLl?p=preview
  • 抛出的错误是由于没有传递 ng-model。对于type=button,我看不到 ng-model 有任何用处……只是一个 UI 按钮
  • 也不是使用ng-前缀的好习惯...暗示核心指令
  • 我现在看到的主要问题是控制器正在使用controllerAs 范围,但您尚未在指令中声明controllerAsSimple demo 获取加载函数以创建警报:

标签: javascript angularjs angularjs-directive components


【解决方案1】:

首先,我认为 ng-model 在按钮中没有任何用途。如果意图是动态设置按钮的文本值,那么您应该使用这种方法:

<button class="btn btn-primary" id="button-loading-example" 
  ng-click="progress.buttonLoading.load()" 
  pb-button-progress type="button">{{progress.buttonLoading.text}}</button>

此外,您的指令模板似乎没有正确使用 ng-transclude,并且自定义指令及其属性不应使用“ng-”前缀。

这是我认为您正在寻找的示例实现:

angular.module('app').directive('pbSpinnerButton', function() {
  return {
    restrict: 'E',
    template: '<button class="{{classList}}" ng-click="onClick()" pb-button-progress type="button" ng-transclude></button>',
    scope: {
      classList: '@',
      onClick: '&'
    },
    transclude: true
  };
});

然后将其包含在您的控制器模板 HTML 中:

<pb-spinner-button class-list="btn btn-primary"
  on-click="progress.buttonLoading.load()"
>{{progress.buttonLoading.text}}</pb-spinner-button>

您可以在这里查看并运行一个简单的实现:http://jsfiddle.net/gagkbsra

【讨论】:

  • 我不明白 onClick 是如何跳转到控制器的功能的。
  • 当您设置 on-click="progress.buttonLoading.load()" 时,您将控制器的功能绑定到 on-click 属性,然后将其存储在指令的范围内作为 'onClick ' (驼峰式范围变量在 html 中转换为小写和破折号)。因此,当您调用 onClick 时,您实际上是在执行控制器的功能。指令范围声明中的“onClick: '&'”表示 onClick 是一个函数。
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 2015-06-02
  • 1970-01-01
  • 2014-10-27
  • 2017-06-05
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多