【问题标题】:AngularJS ng-src and ng-attr-src don't work in IMG tagAngularJS ng-src 和 ng-attr-src 在 IMG 标签中不起作用
【发布时间】:2015-08-17 05:51:47
【问题描述】:

我正在尝试从 MongoDB 返回的数据中的 URL 加载图像。在我的用户的个人资料编辑页面上,他们可以编辑某些详细信息,例如他们的电子邮件地址和他们的用户个人资料图片。电子邮件地址数据绑定得很好,但是他们的个人资料图像的 ng-src 永远不会解析,因此它始终是空白的,即使用户对象包含它应该绑定的正确 URL。

有问题的 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 没有。我不知道我到底缺少什么才能让这项工作像它应该的那样工作。任何帮助将不胜感激!

【问题讨论】:

    标签: angularjs image binding src


    【解决方案1】:

    首先你应该使用 ngRoute 中的 resolve 方法来确保你的数据被解析而不是使用 $timeout。

    我认为这里发生的事情是,由于 currentUser.profileImage 是一个字符串(这是 javascript 中的一个原语),因此没有发生 2 路绑定,因此即使您的函数正在解析,ui 已经将其计算为不明确的。在 ngRoute 中使用 resolve 将确保您的页面在您需要的所有内容都得到解决之前不会加载。

    .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;
    }
    

    【讨论】:

    • 嗨,龙。感谢您的快速回复!我已经按照您的描述实现了这一点,这可能是问题所在,但是我需要为所有路由中的每个页面解决此问题(如果用户登录,则用户名在每个页面上)。有没有一种简单的方法可以做到这一点,而无需在每个 routeProvider.when 分配中重复代码块和解析?再次感谢您!
    • 我相信我在这里找到了解决方案:stackoverflow.com/questions/19937751/… ...如果它解决了我的问题,我会报告回来,因为我需要先实施此修复程序,然后才能测试你的解决方案'已经发布了。
    • 传递给 UserCtrl 的 currentUser 变量是“未定义的”。关于解析代码块的某些内容没有正确返回,因为如果我将 console.log 放入 getCurrentUser().then(... 块中,我可以看到正确的用户数据被注销。
    • 事实证明我有很多问题,最重要的是,ngRoute 对我想要做的事情不够灵活。我发现我需要将解析变量注入到 UserCtrl 函数定义中,没有在 HTML 中的任何位置为 UserCtrl 分配 ng-controller,并且 $routeProvider 不支持每个视图/模板有多个控制器。虽然,我可以使用指令或其他一些解决方法。我将研究 ui-router 作为潜在的替代品。感谢您的宝贵时间。
    • 通过 ngRoute 绝对可以做到这一点,但 ui-router 也是一个选项,它也是我首选的路由模块。对于 ui-router,我会创建一个像这样的状态: .state('root', { resolve: {resolve code here} });然后对于所有其他状态,您只需执行以下操作: .state('otherState', parent: 'root');这基本上会先评估根状态并解析用户。
    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多