1

我只是在 Angular 中找到自己的方式,更重要的是在没有 jQuery 的情况下找到自己的方式!

我想要一个视图显示加载微调器,同时从服务器获取数据,当它到达时(模型将具有“Populated”属性)我希望微调器淡出,内容淡出在。

我正在使用加载位指令,并且 ng-show 似乎很简单,可以切换视图中的部分。

看法:

<div ng-hide="model.Populated" loading-spinner></div>
<div ng-show="model.Populated"><!-- Content goes here --> </div>

指示:

module App.Directives {
declare var Spinner: any;
export class LoadingSpinner {
    constructor() {
        var directive: ng.IDirective = {};
        directive.restrict = 'A';
        directive.scope = { loading: '=myLoadingSpinner'},
        directive.template = '<div class="loading-spinner-container"></div>';
        directive.link = function (scope, element, attrs) {
            var spinner = new Spinner().spin();
            var loadingContainer = element.find('.loading-spinner-container')[0];
            loadingContainer.appendChild(spinner.el);
        };
        return directive;
    }
}

这是我不确定的动画。特别是,一旦微调器完全淡出,我希望内容淡入,我不知道如何通过回调来做到这一点。

我应该使用 CSS 尝试所有动画还是扩展我的指令并使用 javascript?

(我正在为任何想知道语法的人使用 TypeScript)

4

1 回答 1

0

昨天我为我的应用程序做了一个快速的秒杀,这就是它可以轻松完成的方法。这使用 ui.bootstrap 模式对话框。

当您有一个长时间运行的进程(例如远程服务调用)时,您可以通过 $emit “引发”一个事件。这将冒泡到您的最外层范围。这是我针对它的预输入搜索功能的示例。

   function autoCompleteClientName(searchValue, searchType) {

            var self = this;

            self.$emit("WorkStarted", "Loading Clients...");

            //return promise;
            if (searchType === 'name') {
                return $scope.clientSearchDataService.getClientsByName(searchValue)
                    .then(function (response) {

                        self.$emit("WorkCompleted", "");
                        return response.results;
                    }, function(error) {
                        self.$emit("WorkCompleted", "");
                        console.warn("Error: " + error);
                    });
            } else if (searchType === 'number') {
                return $scope.clientSearchDataService.getClientsByNumber(searchValue)
                   .then(function (response) {
                       self.$emit("WorkCompleted", "");;
                       return response.results;
                   }, function (error) {
                       self.$emit("WorkCompleted", "");
                       console.warn("Error: " + error);
                   });
            }
        };

然后我们有一个“shell”控制器,它是最外层视图的控制器,即承载 ng-view 的控制器。

(function () {
    'use strict';

    // Controller name is handy for logging
    var controllerId = 'shellCtrl';

    // Define the controller on the module.
    // Inject the dependencies. 
    // Point to the controller definition function.
    angular.module('app').controller(controllerId,
        ['$scope', '$modal',  shellCtrl]);

    function shellCtrl($scope,$modal) {
        // Bindable properties and functions are placed on vm.
        $scope.title = 'shellCtrl';


        $scope.$on("WorkStarted", function(event, message) {

            $scope.modalInstance = $modal.open({ templateUrl: "app/common/busyModal/busyModal.html" });
        });

        $scope.$on("WorkCompleted", function (event, message) {
            $scope.modalInstance.close();

        });



    }
})();

这是模态模板

<div class="modal-dialog">
    <div class="modal-content">
        <img src="/images/loading.gif"width="55" height="55"/>
        <h3>Loading data...</h3>
    </div>
<!-- /.modal-content -->
</div><!-- /.modal-dialog -->

为此,您必须覆盖一些样式

<style>
        .modal
        {
            display: block;
        }

        .modal-body:before,
        .modal-body:after
        {
            display: table;
            content: " ";
        }

        .modal-header:before,
        .modal-header:after
        {
            display: table;
            content: " ";
        }
    </style>

如果您需要模态的完整模板

<div class="modal-dialog">
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
      <h4 class="modal-title">Modal title</h4>
    </div>
    <div class="modal-body">
      ...
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      <button type="button" class="btn btn-primary">Save changes</button>
    </div>
  </div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->

请记住,这只是一个尖峰,我花了大约 30 分钟来连接在一起。对于更强大的解决方案,如果您正在执行多个调用以删除服务,您需要能够跟踪启动和完成的进程数量等。

于 2013-12-20T16:35:11.217 回答