2015-08-17 1 views
0

Я пытаюсь загрузить изображение из URL-адреса в данные, возвращаемые MongoDB. На странице редактирования профиля моего пользователя они могут редактировать некоторые данные, такие как их адрес электронной почты, и изображение их профиля пользователя. Данные адреса электронной почты являются обязательными, однако ng-src для изображения профиля никогда не разрешается, поэтому он всегда пуст, даже если пользовательский объект содержит правильный URL-адрес, к которому он должен привязываться.AngularJS ng-src и ng-attr-src не работают в теге IMG

HTML в вопросе:

<div ng-controller="userCtrl"> 
    <img ng-src="{{currentUser.profileImage}}" src="{{currentUser.profileImage}}" class="img-responsive" alt="Profile Image"/> 
    <input name="name" type="text" placeholder="Enter Name" class="form-control" ng-model="currentUser.name"/> 
</div> 

AngularJS называют инициализировать данные в моем контроллере:

function UserCtrl($scope, $routeParams, $timeout, userService) { 
    $scope.init = function() { 
    userService.getCurrentUser().then(function(dataResponse) { 
     if (dataResponse.data) { 
     dataResponse.data.profileImage = "images/" + dataResponse.data.profileImage; 
     userService.setCurrentUser(dataResponse.data); 
     $scope.currentUser = dataResponse.data; 
     } 
    }); 
    } 
    $timeout($scope.init()); 
} 

Я попытался все перестановки скобок, вызовов функций, и замедленный метод загрузки, что я мог бы найдите ссылку (следовательно, время ожидания там). Я в тупике о том, почему currentUser.name будет работать нормально, но currentUser.profileImage этого не делает. Я понятия не имею, что мне не хватает, чтобы сделать эту работу такой, какой она должна. Любая помощь была бы очень признательна!

ответ

0

Прежде всего, вы должны использовать метод разрешения в ngRoute, чтобы убедиться, что ваши данные разрешены вместо использования $ timeout.

Я думаю, что здесь происходит то, что поскольку currentUser.profileImage является строкой (которая является примитивом в javascript), нет никакой двусторонней привязки, поэтому, хотя ваша функция разрешима, ui уже вычислил ее как неопределенный. Использование решения в ngRoute гарантирует, что ваша страница не будет загружаться, пока не будет разрешено все, что вам нужно.

.when("/user", { 
    templateUrl: "users.html", 
    controller: "UserCtrl", 
    resolve: { 
     currentUser: function(userService){ 
      var currentUser = null; 
      userService.getCurrentUser().then(function(dataResponse) { 
       if (dataResponse.data) { 
        dataResponse.data.profileImage = "images/" + dataResponse.data.profileImage; 
        userService.setCurrentUser(dataResponse.data); 
        currentUser = dataResponse.data; 
       } 
      }); 

      return currentUser; 
     } 
    } 
} 

Теперь в вашем контроллере вы можете просто сделать это и оставить вас смотреть то же самое, так как ngRoute будет обрабатывать решения:

function UserCtrl($scope, currentUser) { 
    $scope.currentUser = currentUser; 
} 
+0

Привет, Лонг. Спасибо за быстрый ответ! Я реализовал это, как вы описали, и имеет смысл, что это может быть проблемой, однако мне нужно, чтобы это разрешалось для каждой страницы на всех моих маршрутах (имя пользователя находится на каждой странице, если пользователь входит в систему). Есть ли простой способ сделать это без дублирования блоков кода и решения в каждом routeProvider.when назначение? Большое вам спасибо! – Tyler

+0

Я считаю, что нашел решение здесь: http://stackoverflow.com/questions/19937751/angular-how-use-one-resolve-for-all-the-routes-of-my-application ... Я буду ответьте, если он решает мою проблему, потому что мне нужно будет реализовать это исправление, прежде чем я смогу проверить тот, который вы опубликовали. – Tyler

+0

Переменная currentUser, передаваемая в UserCtrl, является «неопределенной». Кое-что о блоке кода разрешения не возвращается правильно, потому что я могу видеть, что правильные пользовательские данные выходят из системы, если я отбрасываю console.log в getCurrentUser(). Then (... block. – Tyler