Angularjs 角度范围初始化有时为空

Angularjs 角度范围初始化有时为空,angularjs,Angularjs,我正在使用angular 1.5和python/mongodb api。 api运行良好(一致且快速),但有时当我加载带有表单的页面时,数据字段为空 应用程序使用ui.router将chap状态与正确的url和chap控制器相关联。我在地址栏中输入url,然后点击return加载页面。在控制器中,path/to/api返回json数据 以下是控制器的简化版本: angular.module('configurer') .controller('chapController', function(

我正在使用angular 1.5和python/mongodb api。 api运行良好(一致且快速),但有时当我加载带有表单的页面时,数据字段为空

应用程序使用
ui.router
chap
状态与正确的url和
chap控制器
相关联。我在地址栏中输入url,然后点击return加载页面。在控制器中,
path/to/api
返回json数据

以下是控制器的简化版本:

angular.module('configurer')
.controller('chapController', function($scope, $http, $state) {
    var url='path/to/api';
    $http.get(url).success(function(data){
        $scope.data = data;
    });

    $scope.save = function()( {
        $http.post(url, $scope.data).success(function() {
            $state.go('home', {reload:true});
        });
    });
angular
  .module('configurer')
  .controller('chapController', function(data, $scope, $http, $state) {
    $scope.data = data;
  }
视图如下所示:

<button class="btn btn-primary" ng-click="save()">Save Changes</button>
<form>
  <div class="row">
    <div class="col-sm-3 form-group">
      <label for="name">Name</label>
      <input class="form-control" id="name" type="text" name="name" ng-model="data.chap.name" />
    </div>
    <div class="col-sm-9 form-group">
      <label for="title">Title</label>
      <input class="form-control" id="title" type="text" title="title" ng-model="data.chap.title" />
    </div>
  </div>
</form>
保存更改
名称
标题
通常,表单中填充了数据,但有时字段为空(使用相同的url)。 我可以从浏览器中重新加载页面,然后进行填充,但这当然不是一个好的用户体验


我做错了什么?

既然您使用的是
ui.router
,我建议您使用它

例如:

$stateProvider
  .state('chap', {
    // ...
    resolve: {
      data: function($http){
        return $http.get(...);
      }
    }
  });
在控制器中:

angular.module('configurer')
.controller('chapController', function($scope, $http, $state) {
    var url='path/to/api';
    $http.get(url).success(function(data){
        $scope.data = data;
    });

    $scope.save = function()( {
        $http.post(url, $scope.data).success(function() {
            $state.go('home', {reload:true});
        });
    });
angular
  .module('configurer')
  .controller('chapController', function(data, $scope, $http, $state) {
    $scope.data = data;
  }

有时数据不会与作用域绑定。你能把这一行算进去吗

$scope.data = data;
$scope.$apply();
内部成功处理程序。
我不确定,它可能有用。请在研究加上反复试验后再试一次,我想我已经找到答案了。作用域未绑定到数据的原因是没有数据:我的服务器正在发送304“未修改”响应

因此,它当然不能绑定不存在的数据,但http响应仍然被视为成功。似乎这是一个常见的“抓到你了”

对我来说,有效的方法是在每个http.get调用中添加一个config对象,如下所示

http.get(url, {cache:true}).success(function(data) { etc...
我的猜测是,您还可以在http请求头上设置
max age
public
,这样服务器就无法使用304响应。这似乎不是最有效的方法,所以我在客户端使用了缓存,这样服务器就不用担心了


这对我来说是可行的,但如果问题再次出现,我会重新发布。

尝试启动$scope.data,我在这里查看文档,不知道如何在我的上下文中使用它:我的数据是一个大型json对象。我今天不能让它失败,我会在可以复制时返回。我现在正在阅读有关resolve的文章,它似乎是针对嵌套状态的情况,但我没有任何嵌套状态。resolve对于您希望在移动到特定状态之前确保数据存在的任何状态都很有用。如果您的视图上可能有一个加载覆盖,并且希望在数据解决之前阻止整个视图ou,那么这一点非常重要。谢谢,但是文档说http调用以$scope结束。apply:所以我看不出再次调用apply会有什么帮助。不过,只要我能够重现这个问题,我就会看看它是否有帮助。