angularjs - 在 AngularJS 指令中加载页面后启用按钮

标签 angularjs angularjs-directive pageload

我试图在 AngularJS 指令中加载页面后启用按钮。我为所有按钮加载期间应用了ng-disabled,并且我希望在之后禁用某些按钮em>加载。

我需要一些指导/建议:

  • 操作 DOM:从 ng-disabled="!newAnimal.isDisabled"到 ng-disabled="newAnimal.isDisabled"

非常感谢您的帮助。谢谢。

HTML:

    <a href="#/{{animal.id}}">
        <button class="btn btn-success" ng-disabled="!newAnimal.isDisabled" id="add-animal" loading-animals>
          Add Animal
        </button>
    </a>

工厂:

    var animalFactory = angular.module('app.myFactory',[])

    animalFactory.factory('newAnimal',function(){
        var newAnimal = function(){
              this.animal = ""; 
              this.totalAnimals = 0;
              this.totalAdopted = 0;
              this.isDisabled = false;
       };
      return newAnimal
   });

Controller (模态):

.controller('InformationCtrl', function($scope, $modalInstance, $http) {
    $scope.ok = function(){
        //check if button successfully clicked
        $modalInstance.dismiss('success');

        //the code below was from a directive ('LoadingAnimals') that I was working on

        //check if all data has been loaded from backend
        var loadingPage = function(){
            return $http.pendingRequests.length > 0;
            //when all objects are loaded, manipulate DOM 
            //make ng-disabled = "!isDisabled" to "isDisabled"
            element.attr("!newAnimal.isDisabled", "newAnimal.isDisabled);
    }
        loadingPage();
    }

指令:

app.directive('loadingAnimals', ['$http', function($http) {
          
return {

        restrict: 'A',

        link: function (scope, element, attrs) {


            var addButton = attrs.ngDisabled;
            //console.log(element.attr('ng-disabled'));
            scope.pageLoad = function() {
                return $http.pendingRequests.length > 0;
            };

            scope.$watch(scope.pageLoad(), function (value) {
                if (value) {
                    element.attr("ng-disabled", "newAnimal.isDisabled");
                } 
                else {
                    element.removeAttr("ng-disabled");
                }
            })
        }
    }

}]);


更新:

我更新了我的指令并且它有效,这不是实现结果的最佳方法,但它是一种方法。

(我希望不要禁用该按钮 3 秒,而是监听 $http 请求,但由于这是一种解决方法,我不会提示)

谢谢大家的回答。如果我找到更有效的方法,我会在将来更新。


指令:

 .directive('loadingAnimals', function() {

       return {

          restrict: 'A',

          link: function (scope, element) {
          var disableLink = (function() {
                element.removeClass('disabled');

            });

            setTimeout(disableLink, 3000);
          }

         }

        }

      ]);


最佳答案

不确定我是否正确,但要在页面完全加载后执行某些操作,您可以使用 angular.element(document).ready() (正如您在 answer 中看到的那样)。

所以你可以有一个 <button>结构如下:

<button type="button" class="btn btn-primary" ng-disabled="!isDisabled || !animal.totalAnimals">Add animal</button>

请参阅下面的示例:

(function() {
  'use strict';

  angular
    .module('app', [])
    .controller('MainCtrl', MainCtrl);

  function MainCtrl($scope) {
    var vm = this;
    vm.animals = [
      {
        "name":"hamster",
        "totalAnimals": 20,
        "totalAdopted": 5,
      },
      {
        "name":"turtle",
        "totalAnimals": 0,
        "totalAdopted": 0,
      },
      { 
        "name":"cat",
        "totalAnimals": 9,
        "totalAdopted": 6,
      },
      { 
        "name":"dog",
        "totalAnimals": 7,
        "totalAdopted": 2,
      },
      { 
        "name":"tiger",
        "totalAnimals": 0,
        "totalAdopted": 0,
      }
    ];
    
    vm.isDisabled = true;
    
    angular.element(document).ready(function () {
      console.log('completely load!');
      vm.isDisabled = false;
    });
  }
})();
<!DOCTYPE HTML>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</head>

<body ng-controller="MainCtrl as main">
  <table class="table table-hover">
    <thead>
      <tr>
      <th>Name</th>
      <th>#of Animals Added</th>
      <th>#of Animals Adopted</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="animal in main.animals track by $index">
        <td ng-bind="animal.name"></td>
        <td ng-bind="animal.totalAnimals"></td>
        <td ng-bind="animal.totalAdopted"></td>
        <td>
          <button type="button" class="btn btn-primary" ng-disabled="!main.isDisabled || !animal.totalAnimals">Add animal</button>
        </td>
      </tr>
    </tbody>
  </table>
</body>

</html>

希望对您有所帮助。

关于angularjs - 在 AngularJS 指令中加载页面后启用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38819094/

相关文章:

javascript - Angular : having a function as ng-false-value

angularjs - 如何在不绑定(bind)的情况下从同一原型(prototype)创建 Angular 模型?

javascript - 数据和指令(结构)

javascript - 如何定期轮询数据,但停止 Firefox 页面加载指示?

javascript - AngularJS 在渲染大约 2000 个元素时真的很慢吗?

jquery - 根据元素数量布置 HTML 元素

javascript - 使用 angularjs 进行表单验证

angularjs-directive - Jade 中的 Angular 指令

javascript - AngularJS:将 $scope 传递给指令

ajax - Visualforce在页面加载时通过Ajax加载apex组件