имя пользователя сеанса не отображается внутри шаблона angularjs ngView, но отображается вне ngView

Таким образом, я могу показать имя пользователя через локальный паспорт мангуста в моем успешном перенаправлении:

app.get('/profile', isLoggedIn, function (req, res) {
    res.render('profile.html', {
        user: req.user
    });
    console.log(req.user.local.username) //correct username for the session
});

... и затем используйте его для отображения в profile.html:

<p><%= user.local.username %></p>

... но при попытке отобразить то же самое в моем ng-view:

<div ng-view ng-class="slide" class="slider"></div>

... через мой шаблон маршрута example.html:

<p>welcome <%= user.local.username %></p>

..отображается как видно: не правильное имя пользователя...

Нельзя ли включить эту информацию в ngView? Есть ли решение включить эту информацию в мой шаблон? Я попытался настроить фабрику с помощью $http:

angular.module('userService', [])

.factory('Users', function($http) {
    return {
        get : function() {
            return $http.get('/profile');
        }
    }
});

... но он возвращал весь html, так что это не правильное решение.

Любое руководство, как всегда, приветствуется и ценится, поэтому заранее спасибо!

Редактировать в ответ: Получение значения и его маршрутизация на самом деле не проблема. Проблема заключается в том, чтобы заставить его правильно отображаться в ngView.

вот мой обновленный код:

Rules.get()
        .success(function (data) {
            $scope.rules = data;
            console.log('Rules.get()');
            console.log(data);

            Users.get()
                .success(function (username) {
                    Users.username = username;
                    console.log('Users.get()')
                    console.log(username)
                });
        });

...а также...

angular.module('userService', [])

.factory('Users', function ($http) {
    return {
        get: function () {
            console.log('userService')
            return $http.get('/profile/user');
        }
    }
});

... который возвращается из:

app.get('/profile/user', function (req, res) {
    console.log('profile/user')
    console.log(req.user.local.username)
    res.json(req.user.local.username);

});

Это дает мне то же самое и правильное имя пользователя, но, увы, как мне его назвать, чтобы оно отображалось в ngView? Если он размещен за пределами фактического div ngView, он отображается нормально.

Из приведенного выше {{username}} {{rules.username}} = ничего. Каким должно быть имя параметра службы в шаблоне ngView (который, как я предполагаю, является совершенно новой $scope)?


person studiobrain    schedule 01.02.2014    source источник


Ответы (2)


Возможен ли дубликат маршрутизации Angular и Express?

Вы можете включить шаблоны ejs (например, <%= value %>) внутри ng-views (см. ссылку выше), но вот три других варианта.

Многие люди передают данные сервера в Angular и позволяют Angular шаблонировать свои представления (например, в стеке MEAN). Это означало бы, что вам не нужно было бы использовать шаблоны ejs в ваших частях angular. Вот три способа передачи данных с вашего сервера в Angular (ссылка на это сообщение в блоге: http://mircozeiss.com/how-to-pass-javascript-variables-from-a-server-to-angular/):

1. метод СРЕДНЕГО

Первый — это то, что используется в стеке MEAN. Вы можете отправить все данные, которые нужны вашему приложению Angular, в оболочке вашего ng-view:

<!-- head -->
<!-- body -->
<!-- ng-view element -->

<script type="text/javascript">window.user = <%- user %>;</script>

<!-- rest of js -->
<!-- /body -->

Таким образом, ваше приложение Angular может получить доступ к данным через поставщика, например:

angular.module('myApp')
.factory('UserData', [
    function() {
        return {
            user: window.user
        };
    }
]);

2. используя $http и API

Второй — предоставление этих данных через restful API и запрос данных через провайдера с использованием $http или $resource:

angular.module('myApp')
.factory('UserData', [
    function($http) {
        $http.get('/userAPI').success(function(data){
            return data;
        });
    }
]);

3. Использование ng-init

Наконец, вы можете использовать шаблоны на стороне сервера внутри файла ng-init.

<div ng-init="user = <%- data %>"></div>

Это поместит данные в $scope.user для использования вашим приложением Angular.

person tfogo    schedule 02.02.2014
comment
Ах хорошо. Извините за недоразумение. Я не могу сказать, в чем проблема, не видя всего приложения. Но вот пример того, чего, как я думаю, вы пытаетесь достичь: plnkr.co/edit/P6MoEa ?p=preview Если бы мне пришлось угадывать, я бы сказал, что Users.username = username; должно быть $scope.username = username. Если у вас все еще есть проблемы, сделайте плунжер того, что у вас есть, и я посмотрю, смогу ли я помочь. - person tfogo; 02.02.2014
comment
Еще одна вещь: вы сказали, что шаблон ngView может иметь совершенно новую область $scope. Да, если у него также есть новый контроллер. Но $scopes наследуются от родительских $scopes, поэтому все в родительском $scope также доступно для дочернего $scope. - person tfogo; 02.02.2014

Итак, вот мое решение для всех, кто может искать:

пользователи.js:

angular.module('userService', [])

.factory('Users', function ($http) {
    return {
        get: function () {
            console.log('userService')
            return $http.get('/profile/user');
        }
    }
});

маршрут.js

$scope.username = {};    
.controller('cntrl', function ($scope, Users) {
        getCurrentUser(Users, $scope);
    })

        function getCurrentUser(Users, $scope) {
        Users.get()
            .success(function (username) {
                $scope.username = username.user;
            });
    }

сервис.js:

app.get('/profile/user', function (req, res) {
    console.log('profile/user')
    console.log(req.user.local.username)
    res.jsonp({ user:req.user.local.username});

});

затем в html (в любом шаблоне ngView):

<span class="username">{{username}}</span>

ключевой момент:

$scope.username = {};
person studiobrain    schedule 04.02.2014