2014-12-10 3 views
0

Так что если в большом количестве моих контроллеров у меня есть это:

$scope.error = false; 
$scope.errorData = {}; 

$scope.working = false; 
$scope.workingMessage = "Doing something, please wait..."; // best UI message ever 

Есть ли способ иметь эти постоянно определяется на каждом $scope данного мои контроллеры?

Так что мне нужно наследование, поэтому, где можно применить эти переменные области видимости к $rootScope, чтобы он был поднят во всех моих контроллерах?

Update

Таким образом, после долгого чтения документации, представляется, что использование ngApp авто бутстрэпов углового приложение, которое, когда $injector работает служба. Мне нужно, чтобы переменные помещались до запуска этой службы, поэтому я предполагаю, что мне нужно вручную загрузить приложение.

Подробнее Работа

.run() 

Это работает после того, как все модули были инициализированы. Поэтому здесь я могу ввести $ rootScope и поместить на него свои переменные. Затем они могут использоваться на всех моих $scope с, очевидно, если вы привязаны к ним данными, вы можете просто использовать имена свойств, потому что связующее сначала будет искать $scope, а затем все последующие родительские области, пока не найдет свойство.

.run(['$rootScope', rootScopeConfigure]); 

function rootScopeConfigure($rootScope) { 
    $rootScope.myCustomProperty = "Hey There"; 
} 

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

Однако, все это создает одну проблему, если я хочу изменить это пользовательское свойство в controller, тогда мне нужно ввести $rootScope. Я не особенно хочу это сделать, я хочу, чтобы иметь возможность доступа к ним на $scope

В ответ на мой выше пункт, я должен быть в состоянии сделать $scope.$root.myCustomProperty, потому что я предполагаю, что $rootScope является корнем из всех $scope s.

Грязный Ответ

$rootScope.$oldNew = $rootScope.$new; 

$rootScope.$new = function() { 
    var childScope = $rootScope.$oldNew(); 
    childScope.myCustomerProp = "Hey There"; 

    return childScope; 
} 

ли это в функции run(). В основном переопределение фабрики, чтобы вернуть новый охват ребенка, на котором есть моя собственность :).

+0

Вы можете поместить переменные, которые будут использоваться во всем приложении, в '$ rootScope', который является родительской областью всех областей. Но имейте в виду, что не рекомендуется загрязнять rootScope ненужными вещами, поскольку он будет использоваться в каждой части приложения, это может вызвать проблемы с производительностью, и это затруднит отслеживание вашего кода. – cubbuk

ответ

0

Так у меня есть ответ сейчас.

.run()

Это работает после того, как все модули были инициализированы. Поэтому здесь я могу ввести переопределение $rootScope - это функция $new, которую я считаю просто простой заводом.

Тогда любые свойства или методы, наложенные на эту новую область применения, могут использоваться на всех моих $scope с.

.run(['$rootScope', runtimeConfigure]); 

function runtimeConfigure() { 
    $rootScope.$oldNew = $rootScope.$new; 

    $rootScope.$new = function(isolate, parent) { 
     var child = $rootScope.$oldNew(isolate, parent); 

     child.title = "Hey There"; 

     return child; 
    } 
} 

Я считаю, что проблем с этим не было.

Во-первых, я всего лишь ореол оригинальной фабрики масштаба $new
Во-вторых, я просто добавляю свойства в новую область.

1

Да, области могут быть унаследованы от родителей. Вы можете создать родительский контроллер для своих контроллеров.

Область могут наследовать от родительской области, как в этом примере:

var parent = $rootScope; 
var child = parent.$new(); 

parent.salutation = "Hello"; 
child.name = "World"; 
expect(child.salutation).toEqual('Hello'); 

child.salutation = "Welcome"; 
expect(child.salutation).toEqual('Welcome'); 
expect(parent.salutation).toEqual('Hello'); 

https://docs.angularjs.org/api/ng/type/$rootScope.Scope

+0

Пожалуйста, см. Мое редактирование на вопрос –

0

Я рекомендую не использовать область видимости, но вместо этого использовать $ cacheFactory или собственную службу/фабрику, чтобы сохранить этот тип состояния.

+0

Итак, идея заключается в том, что я могу создать свой контроллер и без необходимости определять что-либо, чтобы эти параметры были готовы к использованию. Как ваш ответ обращается к этому, не могли бы вы разместить какой-нибудь образец кода? Спасибо за ответ, очень благодарен –

+0

Кроме того, см. Мое новое редактирование с моим грязным ответом на него, может ли это вызвать проблемы? –