2014-08-30 4 views
4

Я пытаюсь работать с угловыми.js, ui-router и require.js и чувствовать себя довольно смущенными. Я попытался выполнить этот урок http://ify.io/lazy-loading-in-angularjs/. Во-первых, позвольте мне показать вам мой код:ленивые загрузки angularjs контроллеры с разрешением ui-router

app.js =>

var app = angular.module('myApp', []); 
app.config(function ($stateProvider, $controllerProvider, $compileProvider, $filterProvider, $provide) { 
    $stateProvider.state('home', 
     { 
      templateUrl: 'tmpl/home-template.html', 
      url: '/', 
      controller: 'registration' 
      resolve: { 
       deps: function ($q, $rootScope) { 
        var deferred = $q.defer(), 
         dependencies = ["registration"]; 
        require(dependencies, function() { 
         $rootScope.$apply(function() { 
          deferred.resolve(); 
         }); 
        }) 
        return deferred.$promise; 
       } 
      } 
     } 
    ); 
    app.lazy = { 
     controller: $controllerProvider.register, 
     directive: $compileProvider.directive, 
     filter: $filterProvider.register, 
     factory: $provide.factory, 
     service: $provide.service 
    }; 
}); 

Теперь в моих registration.js я следующий код:

define(["app"], function (app) { 
    app.lazy.controller("registration" , ["$scope", function ($scope) { 
     // The code here never runs 
     $scope.message = "hello world!"; 
    }]); 
}); 

все работает хорошо, даже код в registration.js запускается. но проблема заключается в том, что код внутри функции контроллера никогда не запускается, и я получаю ошибку Ошибка: [ng: areq] http://errors.angularjs.org/1.2.23/ng/areq?p0=registration&p1=not функция, получившая undefined

Который, кажется, мой код не зарегистрировал функцию контроллера успешно. Есть идеи?

P.s. В ui-router docs говорится: «Если какая-либо из этих зависимостей является обещанием, они будут разрешены и преобразованы в значение до того, как будет создан экземпляр контроллера, и будет запущено событие $ routeChangeSuccess». Но если я положил отложенное. Решает(); из указанного кода внутри timeOut и запустите его, скажем, через 5 секунд, мой код контроллера запускается, и мое представление отображается до разрешения Strange.

+0

не должно быть 'return deferred.promise;' вместо 'return offfer. $ Prom;' в функции разрешения? – sceid

ответ

0

Изменение вашего адреса штата до '' должно сделать трюк. '' есть корень example.com/, '/' есть example.com/#/.

+0

На самом деле, у меня есть другой код, который удаляет конечные косые черты, поэтому я думаю, что не было бы никакой разницы. С другой стороны, я использую html 5 режим маршрутизации. –

+0

Не уверен, что режим маршрутизации html 5 повлияет на это или нет, но я не думаю, что это будет. Что касается вашего кода, который удаляет конечные косые черты, вы имеете в виду, что он удаляет их из ваших URL-адресов штатов, ссылок href или когда маршрут запрашивается, но до его передачи ui-router? – yelvert

+0

Для конечных косых я имею в виду, что нет никакой разницы между _'example.com/sample-url'_ и _'example.com/sample-url/'_. Нет ничего плохого в маршрутизации, поскольку состояние активировано и оно ищет контроллер. Мой контроллер не регистрируется, когда приложение загружается, а не после активации состояния. Но, тем не менее, он должен работать, поскольку он должен быть зарегистрирован до того, как государство попросит диспетчера. –

0

Я пришел, чтобы дать свои 2 цента. Я видел, что вы уже решили, я просто хочу добавить комментарий, если у кого-то есть аналогичная проблема.

У меня была очень похожая проблема, но у меня была часть моего кода, ожидающая загрузки DOM, поэтому я просто позвонил напрямую (не используя «$ (document) .ready»), и он сработал.

$(document).ready(function() { /*function was being called here*/ }); 

И это решило мою проблему. Возможно, это была другая ситуация, но у меня была такая же ошибка.

2

Похоже, я столкнулся с одной и той же проблемой, следуя тому же самому учебнику, что и вы, но с использованием ui-router. Решение для меня было:

  1. Убедитесь, что app.controllerProvider был доступен для ленивого сценария контроллера. Похоже, вы сделали это, используя app.lazy {...}, который действительно приятный штрих BTW :)
  2. Убедитесь, что ленивый скрипт ctrl использует define(), а не require() Я не мог сказать по вашему коду, если вы это сделали.

Вот моя установка UI-маршрутизатор с общественностью app.controllerProvider способом:

app.config(function ($stateProvider, $controllerProvider, $filterProvider, $provide, $urlRouterProvider) { 

    app.lazy = { 
    controller: $controllerProvider.register, 
    directive: $compileProvider.directive, 
    filter: $filterProvider.register, 
    factory: $provide.factory, 
    service: $provide.service 
    }; 

    $urlRouterProvider.otherwise('/'); 

    $stateProvider 

    .state('app', { 
     url:'/', 
    }) 

    .state('app.view-a', { 
     views: { 
     '[email protected]': { 
      templateUrl: 'view-a.tmpl.html', 
      controller: 'ViewACtrl', 
      resolve: { 
      deps: function ($q, $rootScope) { 
       var deferred = $q.defer(); 

       var dependencies = [ 
       'view-a.ctrl', 
       ]; 

       require(dependencies, function() { 
       $rootScope.$apply(function() { 
        deferred.resolve(); 
       }); 
       }); 

       return deferred.promise; 
      } 
      } 
     } 
     } 
    }); 
}); 

Тогда в моем ленивом нагруженном контроллере я заметил, что я должен был использовать require(['app']), как это:

define(['app'], function (app) { 

    return app.lazy.controller('ViewACtrl', function($scope){ 
    $scope.somethingcool = 'Cool!'; 
    }); 

}); 

Источник на GitHub: https://github.com/F1LT3R/angular-lazy-load

Демо-версия на Plunker: http://plnkr.co/edit/XU7MIXGAnU3kd6CITWE7

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