【问题标题】:Angular JSON request goes through, response not being saved to variable?Angular JSON请求通过,响应未保存到变量?
【发布时间】:2015-10-28 03:20:50
【问题描述】:

我正在尝试在我经历的angular-rails tutorial 上实现用户的个人资料页面。我有以下顺序:

/javascripts/users/_users.html

    User's Profile Page
    {{user.email}}

/javascripts/users/users.js

    angular.module('flapperNews').factory('users', ['$http', function($http){
      var o = {
        users: []
      };

      o.get = function(id) {
        return $http.get('/users/' + id + '.json').then(function(res){      
            return res.data;
        });
      };

      return o;
    }])

/javascripts/users/usersCtrl.js

    angular.module('flapperNews')
    .controller('UsersCtrl', [
      '$scope',
      'users',
      'user',
      function($scope, users, user){
        $scope.user = user;


    }])

我的app.js 状态反映了这种变化:

  .state('users', {
    url: '/users/{id}',
    templateUrl: 'users/_users.html',
    controller: 'UsersCtrl',
    resolve: {
      post: ['$stateParams', 'users', function($stateParams, users) {
        return users.get($stateParams.id);
      }]
    }
  })

而用户的控制器是这样的:

    class UsersController < ApplicationController
      respond_to :json

        def show
        respond_with User.find(params[:id])
      end
    end

还有路线:

Rails.application.routes.draw do


  devise_for :users
  devise_for :installs
  root to: 'application#angular'

  resources :posts, only: [:create, :index, :show] do
    resources :comments, only: [:show, :create] do
      member do
        put '/upvote' => 'comments#upvote'
      end
    end

    member do
      put '/upvote' => 'posts#upvote'
    end
  end

  resources :users

end

当使用user id = 2 登录并尝试点击个人资料页面时,它似乎通过了:

    Started GET "/users/2.json" for ::1 at 2015-10-27 23:07:23 -0400
    Processing by UsersController#show as JSON
      Parameters: {"id"=>"2"}
      User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
    Completed 200 OK in 5ms (Views: 0.6ms | ActiveRecord: 0.1ms)

但在实际页面上,我留下了硬编码:

User's Profile Page
{{user.email}}

我觉得我错过了一些简单的东西,有什么想法可能是错的吗?

【问题讨论】:

    标签: ruby-on-rails json angularjs


    【解决方案1】:

    您的 return 语句在 $http 调用实际填充数据之前执行。您需要使用$q

    在役:

    var deferred = $q.defer();
    $http.get('job.json')
        .success(function(response) {
            defer.resolve(response);
        }).error(function(error) {
            console.log(error);
        })
    return deferred.promise;
    

    在控制器中:

    var p = <serviceCall>
    p.then(function(s){
       $scope.ans=s;
    })
    

    $q 用于获取同步响应。有关详细信息,请阅读 Angular 文档https://docs.angularjs.org/api/ng/service/$q

    【讨论】:

    • 我回家后会试试这个,但是有一个问题:教程中的所有其他功能都是这样设置的(例如帖子),并且它们可以工作。那么为什么它们会起作用,而这不起作用呢?那些“异步”响应?
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 2020-08-07
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多