2013-07-12 2 views
0

В следующей директиве я выполняю довольно длительную операцию, поэтому я хочу отображать крутящий момент загрузки за это время. Я использовал ng-show и переменную isLoading в области действия директивы. Однако прядильщик никогда не показывает, хотя isLoading имеет значение true.angularjs: пользовательский интерфейс, не обновляющий внутреннюю директиву

Что случилось с моим кодом?

angular.module('shared.directives').directive("xmlVisualizer", ['$rootScope', function ($rootScope) { 
return { 
    restrict: 'E', 
    template: '<div ng-show="isLoading" class="center span10"><i class="icon-spinner icon-6x">chargement du fichier...</i> </div> <div class="center span10" ng-show="!isLoading"> <h4>Détail du fichier {{title}}</h4> <pre id="test" class="prettyprint"></pre></div>', 
    scope: { 
     model: '=', 
     title: '=' 
    }, 
    link: function (scope, element, attrs) { 
     if (scope.model) { 
      scope.isLoading = true; 

      scope.xml = vkbeautify.xml(scope.model); 
      $("#test").text(scope.xml); 
      $("#test").html(prettyPrintOne($("#test").html(), 'xml')); 

      scope.isLoading = false; 
     } 
    } 
} 
}]); 

ответ

0

Вы должны наблюдать за рамки

Попробуйте

angular.module('shared.directives').directive("xmlVisualizer", ['$rootScope',  function ($rootScope) { 
    return { 
     restrict: 'E', 
     template: '<div ng-show="isLoading" class="center span10"><i class="icon-spinner icon-6x">chargement du fichier...</i> </div> <div class="center span10" ng-show="!isLoading"> <h4>Détail du fichier {{title}}</h4> <pre id="test" class="prettyprint"></pre></div>', 
     scope: { 
      model: '=', 
      title: '=' 
     }, 
     link: function (scope, element, attrs) { 
      scope.$watch(function(scope){return scope.model}, function(model){ 
       if (model) { 
        scope.isLoading = true; 

        scope.xml = vkbeautify.xml(scope.model); 
        $("#test").text(scope.xml); 
        $("#test").html(prettyPrintOne($("#test").html(), 'xml')); 

        scope.isLoading = false; 
       } 
      }) 
     } 
    } 
}]); 

PS: Я не очень хорошо знаком с угловой себя. Надеюсь, что это работает для вас.

+0

Это не похоже на меня. Зачем мне смотреть весь масштаб? и это не приведет к обновлению пользовательского интерфейса. Я попробовал scope. $ Apply(), хотя и не работал, так как уже происходит переваривание. – Sam

+0

Угадайте, что вам нужно явно наблюдать за областью действия внутри функции ссылок. U может рассмотреть возможность регистрации аргументов вашей функции ссылок, чтобы узнать, сколько раз она вызывается. Логика имела бы это, что он будет вызываться каждый раз, когда происходит изменение области видимости, но на самом деле он называется только при инициализации или изменении конкретного html в DOM. Никакое изменение области действия фактически не вызывает функцию связи, которую вы написали. Также каждое изменение в сфере действия не будет вызывать вторую функцию внутри аргумента $ watch. Я вывел все это через консольное ведение журнала. Может быть не на 100% прав. Попытка помочь –

+0

@ Да, он не смотрит всю сферу, просто модель. 'function (scope) {return scope.model}' эквивалентно '' model'' – finishingmove

1

Я думаю, что ваша проблема в том, что isLoading в шаблоне не является директивой isLoading, а ищет ее в родительском пространстве. Следовательно, поскольку это undefined (и остается undefined, потому что вы только меняете isLoading внутри директивы), он всегда показывает блок !isLoading.

Вы можете попробовать сделать

template: '<div is-loading="isLoading" ng-show="isLoading" class="center span10"><i class="icon-spinner icon-6x">chargement du fichier...</i> </div> <div class="center span10" ng-show="!isLoading"> <h4>Détail du fichier {{title}}</h4> <pre id="test" class="prettyprint"></pre></div>', 
    scope: { 
     model: '=', 
     title: '=', 
     isLoading: '=' 
    }, 

, но я не уверен, если он будет работать с примитивным. Если нет, попробуйте объект $scope.isLoading = {value: true}; (на родительском объекте - возможно, контроллер) и is-loading="isLoading.value" (на шаблоне).

Таким образом, флаг spinner на вашем контроллере будет обновляться через двунаправленную привязку, и ваша директива сможет использовать его в своем шаблоне.

Смежные вопросы