【问题标题】:Controller actions being executed as soon as the page loads页面加载后立即执行控制器操作
【发布时间】:2015-11-03 00:23:07
【问题描述】:

我在设计中使用 rails,在 ng-file-upload 中使用 angular。 我有两个问题。首先,一旦我进入网站的根目录,就会执行一个 POST 请求以尝试登录用户,并导致 500 状态代码响应。 它说它找不到users_url,这是有道理的,因为我的路线中没有,奇怪的是该请求被触发了。

同样使用 ng-file-upload,当我加载对话框以上传文件时,对话框会加载并发送直接上传文件的请求。无需等待。

为什么会这样? 这是在所有这些操作中执行的不同文件:

app.coffee

app = angular.module("inkorporated", ['ui.router', 'templates', 'rails', 'Devise', 'ngFileUpload', 'ngDialog'])
  .config(['$stateProvider','$urlRouterProvider',
  ($stateProvider, $urlRouterProvider)->
    $stateProvider
      .state('home', {
        url: '/home'
        templateUrl: 'home/_home.html'
        controller: 'SearchCtrl'
      })
      .state('login', {
        url: '/login'
        templateUrl: 'auth/_login.html'
        controller: 'AuthCtrl'
        onEnter: ['$state', 'Auth', ($state, Auth)->
          Auth.currentUser().then ->
            $state.go('home')
            return
          return
        ]
      })
      .state('register', {
        url: '/register'
        templateUrl: 'auth/_register.html'
        controller: 'AuthCtrl'
        onEnter: ['$state', 'Auth', ($state, Auth)->
          Auth.currentUser().then ->
            $state.go('home')
            return
          return
        ]
      })
      .state('user', {
        url: '/user/{id}'
        templateUrl: 'users/_user.html'
        controller: 'UserCtrl'
      })
    $urlRouterProvider.otherwise('home')
    return
])

navCtrl.coffee

angular.module("inkorporated").controller('NavCtrl', ['$scope', '$state', 'Auth',
  ($scope, $state, Auth)->

    $scope.config = {
      headers: {
        'X-CSRF-TOKEN': $('meta[name=csrf-token]').attr("content")
      }
    }

    $scope.signedIn = Auth.isAuthenticated
    $scope.logout = Auth.logout

    Auth.currentUser().then(
      (user)->
        if !!user.email
          $scope.user = user
        else
          $scope.user = {}
        return
    )

    $scope.$on('devise:new-registration',
      (e, user)->
        $scope.user = user
        return
    )

    $scope.$on('devise:login', 
      (e, user)->
        if !!user.email
          $scope.user = user
        else
          $scope.user = {}
        return
    )

    $scope.$on('devise:logout',
      (e, user)->
        $scope.user = {}
        return
    )
    return
])

头像Ctrl.coffee

angular.module("inkorporated").controller("AvatarCtrl", ["$scope", "$stateParams", "Upload", "ngDialog"
  ($scope, $stateParams, Upload, ngDialog)->

    $scope.$watch('avatar',
      (avatar)->
        $scope.upload($scope.avatar)
        return
    )

    $scope.upload = (avatar)->
      Upload.upload({
        url: "users/avatar",
        fields: { 'id': $stateParams.id }
        file: avatar
      })
      .success(
        (data, status, headers, config)->
          $scope.closeThisDialog()
          return
      )
      return
    return
])

application.html.haml

!!!
%html{ "ng-app" => "inkorporated" }
  %head
    %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
    %meta{ name: "viewport", content: "width=device-width, initial-scale=1" }/
    %title Inkorporated
    = stylesheet_link_tag    'application', media: 'all'
    = javascript_include_tag 'application'
    = csrf_meta_tags
  %body
    .container-fluid
      %header{ "ng-include" => "'nav/_nav.html'" }
    #page-content.container      
      %ui-view

【问题讨论】:

  • 不清楚can't find users_url 是什么意思。推测它是用于发出请求的 url,该请求将由 navCtrl 触发。至于上传不清楚no wait in between是什么意思
  • can't find users_url 不是重要的部分,是页面加载后立即触发操作。只要我访问网站localhost:3000,我就可以看到POST 请求被触发到http://localhost:3000/users/sign_in.json,我不知道为什么会这样。另一件事是,当我加载使用ng-file-upload 的对话框时,它会在对话框打开后立即尝试上传文件,同时向http://localhost:3000/users/avatars 发送请求,这是我为修改头像而设置的地址
  • 可能在 Auth.currentUser() 内调用 navBarCtrl。虽然没有显示代码。您的上传绑定到 `$watch` ...应该检查 newValue 或重新考虑上传逻辑
  • @charlietfl 是 Angular 设计服务的一部分
  • 但设计是后端...您的问题在于在浏览器中运行的角度代码。该服务可能会发出该帖子请求,尽管我看不到它的作用

标签: ruby-on-rails angularjs devise coffeescript haml


【解决方案1】:

从我在这里看到的情况来看,我认为$watch 很有可能在您的对话框打开时由avatar 上的模型更改触发。你可以很容易地移除那个手表,让这个功能更受事件驱动。查看 ng-file-uplpad 文档,似乎有一个指令属性来指定调用自定义函数,如 ngf-change="myFunction()"

$scope.$watch('avatar', function(avatar) {
  $scope.upload($scope.avatar);
});

对于您问题的第二部分,我很想知道登录页面上调用的 SearchCtrl 中的代码是什么,该 POST 请求很容易与其中的某些内容相关

【讨论】:

  • SearchCtrl 是空的,只是控制器的声明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多