在角度控制器中从服务器获取用户数据而不暴露数据

时间:2013-07-25 16:19:15

标签: ruby-on-rails angularjs

我一直在尝试将用户数据从rails控制器获取到角度控制器:

在我的application.html.erb中,我这样定义User

angular.element(document).ready(function() {
    angular.module('myModule').value('User', <%= @user.to_json.html_safe %>);
});

在我的角度控制器中:

myModule.controller('MyController', ['$scope', 'User', function($scope, User) {
    $scope.user = User;
}]);

这个问题是它将用户数据暴露给视图。有更好的方法吗?

我也试过这种方法:

在我的模块中,我创建了一个带有$ resource对象的工厂:

myModule.factory('User', function($resource) {
    return $resource('/users/:action', {},
    {
        'getUser': { method: 'GET', params: { action: 'fetch_user.json' }, isArray:true }
    });    
});

在我的控制器中:

myModule.controller('MyController', ['$scope', 'User', function($scope, User) {
    $scope.user = User.getUser();

    // Also tried the following.
    // This will throw undefined errors in places that are trying to access $scope.user
    User.getUser({}, function(data) {
        $scope.user = data;
    });
}]);

但是,这或者没有按时加载用户数据并且在我的应用程序中抛出undefined错误,或者它会将结果的每个字符放在它自己的数组容器中。

@user变量作为json从users_controller.rb中的服务器返回,所以理想情况下,我想要检索它并将其存储在$scope.user中。这样做的问题是它需要将username作为参数传递以检索正确的用户数据。

如何在不暴露数据的情况下正确,干净地设置$scope.user

1 个答案:

答案 0 :(得分:0)

<强>指令

myModule.factory('User', function($http) {
    return {
        getUser: function () {
            // deferred object
            var deferred = $q.defer();
            $http.get('/fetch_user.json') {
                .success(function (data, status) {
                     deferred.resolve(data);
                })
                .error(function (data, status) {
                     deferred.reject("An error occured while trying to get users");
                });
            }
            return deferred.promise;
       }
    }
}

<强>位指示:

myModule.controller('MyController', ['$scope', 'User', function($scope, User) {
     User.getUser().then(function (data) {
         $scope.user = data;
     });
}]);

我假设/fetch_user.jsonurl,如果不是替换它。

<强>更新