Я хотел бы поделиться другим решением, работающим с UI-маршрутизатором 1.0.0.X.
Как вы, возможно, знаете, stateChangeStart и stateChangeSuccess теперь устарели. https://github.com/angular-ui/ui-router/issues/2655
Вместо этого вы должны использовать $ transitions http: //angular-ui.github. io / ui-router / 1.0.0-alpha.1 / interfaces / transition.ihookregistry.html
Вот как я этого добился:
Сначала у меня и AuthService с некоторыми полезными функциями
angular.module('myApp')
.factory('AuthService',
['$http', '$cookies', '$rootScope',
function ($http, $cookies, $rootScope) {
var service = {};
// Authenticates throug a rest service
service.authenticate = function (username, password, callback) {
$http.post('api/login', {username: username, password: password})
.success(function (response) {
callback(response);
});
};
// Creates a cookie and set the Authorization header
service.setCredentials = function (response) {
$rootScope.globals = response.token;
$http.defaults.headers.common['Authorization'] = 'Bearer ' + response.token;
$cookies.put('globals', $rootScope.globals);
};
// Checks if it's authenticated
service.isAuthenticated = function() {
return !($cookies.get('globals') === undefined);
};
// Clear credentials when logout
service.clearCredentials = function () {
$rootScope.globals = undefined;
$cookies.remove('globals');
$http.defaults.headers.common.Authorization = 'Bearer ';
};
return service;
}]);
Тогда у меня есть эта конфигурация:
angular.module('myApp', [
'ui.router',
'ngCookies'
])
.config(['$stateProvider', '$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/resumen');
$stateProvider
.state("dashboard", {
url: "/dashboard",
templateUrl: "partials/dashboard.html",
controller: "dashCtrl",
data: {
authRequired: true
}
})
.state("login", {
url: "/login",
templateUrl: "partials/login.html",
controller: "loginController"
})
}])
.run(['$rootScope', '$transitions', '$state', '$cookies', '$http', 'AuthService',
function ($rootScope, $transitions, $state, $cookies, $http, AuthService) {
// keep user logged in after page refresh
$rootScope.globals = $cookies.get('globals') || {};
$http.defaults.headers.common['Authorization'] = 'Bearer ' + $rootScope.globals;
$transitions.onStart({
to: function (state) {
return state.data != null && state.data.authRequired === true;
}
}, function () {
if (!AuthService.isAuthenticated()) {
return $state.target("login");
}
});
}]);
Вы можете видеть, что я использую
data: {
authRequired: true
}
, чтобы отметить состояние доступно только если аутентифицирован.
затем, на .run я использую переходы для проверки состояния с аутентификацией
$transitions.onStart({
to: function (state) {
return state.data != null && state.data.authRequired === true;
}
}, function () {
if (!AuthService.isAuthenticated()) {
return $state.target("login");
}
});
Я строю этот пример, используя некоторый код, найденный в документации $ переходов. Я довольно новый пользовательский интерфейс роутера, но он работает.
Надеюсь, что это может кому-нибудь помочь.
Как насчет этого?
for x in wowList:
installWow(x, 'installed by me')
del x
Вы могли создайте свою собственную функцию "each":
def each(fn, items):
for item in items:
fn(item)
# called thus
each(lambda x: installWow(x, 'installed by me'), wowList)
В основном это просто карта, но без возврата результатов. Используя функцию, вы убедитесь, что переменная "item" не попадает в текущую область видимости.
Каждое выражение оценивает что-то, поэтому вы всегда получаете результат, каким бы способом вы это ни делали. И любой такой возвращенный объект (как и ваш список) будет впоследствии отброшен, потому что на него больше нет ссылки.
Для пояснения: очень немногие вещи в python являются операторами, которые ничего не возвращают. Даже такой вызов функции, как
doSomething()
, по-прежнему возвращает значение, даже если оно сразу же отбрасывается. В python не существует такой вещи, как разграничение функций и процедур Паскаля.
Вы можете использовать фильтр и функцию, которая не возвращает значение True. Вы получите пустой список возврата, поскольку фильтр добавляет только те значения, которые оцениваются как истинные, что, как я полагаю, сэкономит вам немного памяти. Примерно так:
#!/usr/bin/env python
y = 0
def myfunction(x):
global y
y += x
input = (1, 2, 3, 4)
print "Filter output: %s" % repr(filter(myfunction, input))
print "Side effect result: %d" % y
Запуск дает следующий результат:
Filter output: ()
Side effect result: 10
Вы можете попробовать следующее:
filter(lambda x: installWow(x, 'installed by me') and False, wowList)
Таким образом, результатом будет пустой список, несмотря ни на что.
Или вы можете просто отбросить и False
, если вы можете заставить installWow ()
всегда возвращать False
(или 0, или None
или другое выражение, которое оценивает false).
Я не могу удержаться, чтобы опубликовать его как отдельный ответ
reduce(lambda x,y: x(y, 'installed by me') , wowList, installWow)
только поворот - это установкаWow должен вернуть себя, например,
def installWow(*args):
print args
return installWow
, если можно нарушить работу wowList
while wowList: installWow(wowList.pop(), 'installed by me')
, если вы действительно хотите поддерживать wowList
wowListR = wowList[:]
while wowListR: installWow(wowListR.pop(), 'installed by me')
] и если порядок имеет значение
wowListR = wowList[:]; wowListR.reverse()
while wowListR: installWow(wowListR.pop(), 'installed by me')
Хотя как решение загадки мне нравится первое :)
сначала перепишите цикл for как выражение генератора, которое не выделяет никакой памяти.
(installWow(x, 'installed by me') for x in wowList )
Но это выражение на самом деле ничего не делает, если не находит способа его использовать. Таким образом, мы можем переписать это, чтобы получить что-то определенное, вместо того, чтобы полагаться на возможный результат None
installWow
.
( [1, installWow(x, 'installed by me')][0] for x in wowList )
, который создает список, но возвращает только константу 1. Это можно удобно использовать с помощью reduce
reduce(sum, ( [1, installWow(x, 'installed by me')][0] for x in wowList ))
, который удобно возвращает количество затронутых элементов в wowList.
Просто сделайте installWow return None или передайте последний оператор следующим образом:
def installWow(item, phrase='installed by me'):
print phrase
pass
и используйте это:
list(x for x in wowList if installWow(x))
x не будет установлен в глобальном пространстве имен и будет возвращен список [] синглтон