2013-08-08 3 views
6
angular.module('mainApp'). 
    controller('dynamicRouteController', ['$scope', '$controller', '$routeParams', function($scope, $controller, $routeParams) { 
    if(/^\d+$/.test($routeParams.pageOrName)) { 
     $scope.controller = $controller('thisController', { $scope: $scope }).constructor; 
     $scope.templateUrl = '/www/thisPage'; 
    } else { 
     $scope.controller = $controller('thatController', { $scope: $scope }).constructor; 
     $scope.templateUrl = '/www/thatPage'; 
    } 
    }]); 

это minifies к:

"use strict"; 
angular.module("mainApp"). 
controller("dynamicRouteController",["$scope",‌​"$controller","$routeParams",function(a,b,c){ 
/^\d+$/.test(c.pageOrName)? 
(a.contro‌​ller=b("thisController",{$scope:a}).constructor,a.templateUrl="/www/thisPage"): 
(a‌​.controller=b("thatController",{$scope:a}).constructor,a.templateUrl="/www/thatPa‌​ge") 
}]) 

Это возникают проблемы Минимизация, я думаю, что его из-за {$ охвата: $ сфера} изменяются. .. В первый раз я столкнулся с этим/использовал этот метод. Кто-нибудь знает лучший способ написать это, чтобы он правильно менял?

EDIT: так что происходит, это то, что он пропускает {$ scope: a}, что хорошо, но на этом ссылочном контроллере, когда его минимизировано, этот $ scope стал a или b или e в зависимости ... поэтому, если я напишу код «pre-minimified», то есть я буквально нахожу, какая буква представляет $ scope в другом контроллере, я могу заставить его работать, но это так взломано! Опять же, какие-то идеи?

Использование Grunt для минимизации Угловая версия 1.0.5 ... может быть исправлена ​​в более поздних версиях?

2nd EDIT: Порядочный ответ - это бросить оба контроллера в один и тот же файл, явно ... который уродливый ... но он работает! поэтому с одним контроллером я объявляю 2 подконтрольных контроллера, что является хромым. Если вы знаете другой способ, пожалуйста, поделитесь с классом!

+1

Просто принимайте дикие предположения здесь, но '{" $ scope ": $ scope}'? – Phil

+0

хороший звонок Фил, я пробовал это безрезультатно, хотя :( – mclenithan

+1

Есть комментарий к ['$ controller'] (http://docs.angularjs.org/api/ng.$controller) doco, который имеет' { $ scope: {}} '. Дайте это попробовать – Phil

ответ

3

Я работал над этим вопросом с @mclenithan и то, что мы придумали это:

$scope.controller = ['$scope', 'service1', 'service2', 
    $controller('thisController', { $scope: $scope }).constructor]; 

Основная проблема была контроллерами thisController и thatController имели больше параметров вводить не только $scope (в этом примере ожидает service1 и service2).

$controller(...).constructor возвращал функцию миниатюрного контроллера с параметрами, переименованными в a, b, c, d и т. Д. Когда Angular пытался создать экземпляр контроллера, у него возникли проблемы с поиском правильных служб для инъекций.

Использование функции array notation вместо функции контроллера устраняет проблему. См. a note on minification в учебнике для получения дополнительной информации.

Также см. this question для контекста того, что мы пытались сделать для начала.

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