AngularJS - 通过自定义指令控制ng-show

时间:2017-06-06 08:28:54

标签: javascript angularjs

----更新,请参阅下面的原始问题----

我正在孤立这个问题,现在这里的东西搞乱了ng-show,我无法直接控制它。

查看

<div class="alert alert-danger" ng-show="vm.errorNoExistePDF" data-translate="webclientesApp.policy.terms.errorPDF">
    Ocurrio un problema al tratar de recuperar el archivo.
</div>

CONTROLLER

 function PolicyController(Principal, Policy, $locale, $rootScope) {

        var vm = this;
        vm.polizas = null;
        vm.errorNoExistePDF = false;

指令

function tablaPolizas(Principal, $locale, $state, $rootScope, $http, $window, $stateParams) {
var directive = {

    templateUrl: 'app/components/tabla-polizas/tabla-polizas.html',
    link: linkFn,

    ...

function linkFn($scope, $element, $attrs) {

vm.errorNoExistePDF = true;

...

angular.element('#tabla-polizas').on('click', '#terms', function() {
                    var table = angular.element('#tabla-polizas').DataTable();

        $http.get('/webclientes/api/policies/getPlanFile/'+datos, {
                        responseType: 'blob'
                    })
                    .success(function(data, response) {

                        ...

                    })
                    .error (function(data){
                        console.log("ERROR");
                        vm.errorNoExistePDF = true;
                    });
            });

----原始问题----

我正在尝试显示一个带有ng-show的警告消息,该控件在控制器中调用其值(布尔值)通过自定义指令更改的范围。

查看

<div class="alert alert-danger" ng-show="vm.errorNoExistePDF" data-translate="webclientesApp.policy.terms.errorPDF">
    Ocurrio un problema al tratar de recuperar el archivo.
</div>

CONTROLLER

 function PolicyController(Principal, Policy, $locale, $rootScope) {

        var vm = this;
        vm.polizas = null;
        vm.errorNoExistePDF = false;

指令

 function tablaPolizas(Principal, $locale, $state, $rootScope, $http, $window, $stateParams) {
    var directive = {

        templateUrl: 'app/components/tabla-polizas/tabla-polizas.html',
        link: linkFn,
       restrict: "E",
       controller: function(){
        var vm = this;
        vm.errorNoExistePDF = false;
        },
        controllerAs: 'vm'
    }

    return directive;

    function linkFn($scope, $element, $attrs) {

        var vm = this;
        var urlIdioma = null;
        var table = angular.element('#tabla-polizas');
        var dataRow = null;
        var id = null;
        var estaFila = null;
        vm.errorNoExistePDF = false;

        ...

        $http.get('/webclientes/api/policies/getPlanFile/'+datos, {
                            responseType: 'blob'
                        })
                        .success(function(data, response) {

                            var file = new Blob([data], {
                                type: 'application/pdf'
                            });
                            var fileURL = URL.createObjectURL(file);

                            if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
                                    $window.navigator.msSaveOrOpenBlob(file);
                            }else
                            $window.open(fileURL);
                        })
                        .error (function(data){
                            console.log("ERROR");
                            vm.errorNoExistePDF = true;
                        });
                });

这里应该发生的是当用户点击数据表按钮时,如果服务器响应不好,ng-show(vm.errorNoExistePDF)应该触发并显示消息,但我无法理解逻辑链接指令和控制器。

请帮助我理解这一点。

1 个答案:

答案 0 :(得分:0)

我认为该问题与范围有关,如果您将controllerAs语法与指令一起使用,并且您希望将外部范围绑定到指令的控制器范围,则应使用bindToController: true

所以你可以尝试使用这个指令定义:

var directive = {
    templateUrl: 'app/components/tabla-polizas/tabla-polizas.html',
    link: linkFn,
    restrict: "E",
    scope: {
        errorNoExistePDF: '@'
    },
    bindToController: true,
    controller: function(){
        var vm = this;
        vm.errorNoExistePDF = false;
    },
    controllerAs: 'vm'
}