从index.html调用函数,函数循环不确定

时间:2016-05-14 21:01:02

标签: javascript angularjs node.js

我正在尝试创建一个只向具有正确角色的用户显示html的某个部分的函数。这些是我的功能:

的NodeJS / server.js

app.get('/api/isadmin', ensureAuthenticated, function (req, res) {
  User.findById(req.user, function (err, user) {

    res.send(user);
  });
});

这是问题发生的地方,它将无限期地运行:

<ul ng-if="isAdmin()">
   <li>
       <a ui-sref="admin">Admin</a>
   </li>
</ul>

为什么会这样?我看过Satellizer的isAuthenticated功能,基本上做了同样的事情。

编辑: 更新的代码:

adminservice.js

angular.module('App')
 .factory('AdminService', function ($q, $http, toastr) {

  return {
      getAdmin: function () {
          var httpget = $http.get('http://localhost:3000/api/isadmin');

          httpget.then(function (response) {
                var res = response.data.role;
                if (res == 'admin') {
                    console.log('true');
                    return true;
                }
                else {
                    console.log('false');
                    return false;
                }
            }, function (result) {
                return $q.reject(result);
            });

          return httpget;

      }
  };
});

navbar.js

angular.module('App')
 .controller('NavbarCtrl', function($q, $scope, $auth, AdminService) {

  $scope.isAuthenticated = function() {
     return $auth.isAuthenticated();
  };

  AdminService.getAdmin().then(
    function (result) {
        $scope.isAdmin = result;
    });
});

这两个回复(无论是真还是假)仍然可以看到管理员列表元素。

1 个答案:

答案 0 :(得分:1)

我准备写很多东西。由于您已经找到并更新了代码,因此我要解决现有问题。您需要return来自getAdmin函数的承诺实例,而不是httpget

angular.module('App')
 .factory('AdminService', function ($q, $http, toastr) {

  return {
      getAdmin: function () {
          var httpget = $http.get('http://localhost:3000/api/isadmin');

          return httpget.then(function (response) {
                var res = response.data.role;
                if (res == 'admin') {
                    console.log('true');
                    return true;
                }
                else {
                    console.log('false');
                    return false;
                }
            }, function (result) {
                // just return false
                return false;
            });
      }
  };
});

你的控制器看起来很好。在html部分中,将ng-if与isAdmin属性绑定。

<ul ng-if="isAdmin">
   <li>
       <a ui-sref="admin">Admin</a>
   </li>
</ul>

希望,这有帮助。

<强>更新

只返回httpget将返回promise实例,但您将在resolve函数中获得实际响应。您调用http://localhost:3000/api/isadmin的响应。请参阅此插件:http://plnkr.co/edit/9UtYJlm9BalTi8HHTrV2?p=preview