2015-02-23 2 views
0

Вот моя настройка. У меня есть контроллер, который использует службу, которая выполняет некоторую работу, и затем возвращает данные асинхронно. В этом случае данные возвращаются тайм-аут, но в реальной жизни это было бы сделать что-то более интересное:Правильный способ обработки асинхронных обновлений в угловом контроллере

Вид:

<div ng-controller="RootController as root"> 

    <h1>Angular Project</h1> 
    <div ng-show="{{root.greeting}}"> 
    <p>{{root.greeting}}</p> 
    </div> 

</div> 

Контроллер:

(function(){ 

    'use strict'; 

    function RootController(greetingService) { 

    var vm = this; 
    vm.greeting = ''; 

    // startup logic 
    activate(); 

    function activate() { 
     greetingService.greeting().then(
      function(response) { 
       vm.greeting = response; 
      }, 
      function(error) { 
       vm.greeting = error; 
      } 
     ); 
    } 
    } 
    RootController.$inject = ['greeting']; 
    angular.module('app.core').controller('RootController', RootController); 

})(); 

Услуги:

(function() { 
    'use strict'; 

    // Greeting Service 
    function greeting($timeout) { 

    // public API 
    var service = { 
     greeting: greeting 
    }; 
    return service; 

    // internal functions 
    function greeting() { 
     return $timeout(function() { 
      return 'Hello world!'; 
     }, 1000); 
    } 

    } 

    temp.$inject = ['$timeout']; 
    angular.module('app.core').factory('greeting', greeting); 

})(); 

Вопросы:

  1. Почему мой просмотр не обновляется, когда тайм-аут разрешается и назначение vm.greeting происходит в моем контроллере? Я видел, как люди описывают «внутри углового и вне углового», но мне кажется, что я не пошел «вне углового» здесь.

  2. Я знаю, что могу называть $ scope. $ Apply(), но я столкнулся с ошибкой «digest is already in progress», и снова мне кажется, что я не должен этого делать.

  3. Есть ли лучший способ организовать мои компоненты? Я также экспериментировал с трансляцией события над $ rootScope и записью обработчика событий в контроллере, но эта компоновка имеет тот же результат (а именно, представление не обновляется при изменении асинхронной модели).

+0

Действительно ли это делает это .success? Можете ли вы проверить, действительно ли установлен vm.greeting? – ribsies

+0

@ribsies да. Я отредактировал код для этого вопроса, чтобы избавиться от всего постороннего, но тайм-аут разрешается, и моя функция .then (success) выполняется. Когда я отлаживаю область в Chrome Dev Tools и смотрю на значение angular.element ($ 0) .scope(). Root.greeting, я вижу правильное значение. – Alex

ответ

0

так, как вы структурировали ваши код - это ve что отличается от того, что я обычно делаю. Ознакомьтесь с этой ссылкой для отличного руководства по стилю. http://toddmotto.com/opinionated-angular-js-styleguide-for-teams/

Что касается вашей проблемы, Angular использует $ scope для привязки значения в контроллере к представлению. Таким образом, ваш контроллер должен иметь $ scope, и вы можете сделать $ scope.greeting вместо vm.greeting.

+0

Использование (или отсутствие использования) $ scope не было моей проблемой. Использование синтаксиса «controller as ...» означает, что вы не назначаете свои свойства и функции в $ scope, а на свой объект Controller. – Alex

+0

Как я уже сказал, я делаю что-то по-другому, но я оставлю свой ответ, поскольку руководство по стилю стоит прочитать на мой взгляд. – Davie

+0

Посмотрите на ту ссылку, на которую вы ссылаетесь. Я рассмотрел множество примеров, но мне нравится это руководство: https://github.com/johnpapa/angularjs-styleguide – Alex