【问题标题】:Angular model does not change(update) after changing url更改 url 后 Angular 模型不会更改(更新)
【发布时间】:2014-07-25 11:48:28
【问题描述】:

解决方案:var deferred2 = $q.defer(); 这应该在方法 _getSpecificPerson() 中,因为当我访问其他人时,承诺已经解决。这样我每次都会创建新的延迟对象。

我有一些列表,例如人员列表。如果我访问详细信息页面(不同的视图,不同的控制器),我的网址如下:#/PersonDetails/0c4274ed-ae76-4648-bba4-434a3040b9c5,但是当返回并想查看其他人的详细信息时,我会得到与之前相同的页面我可以看到我已经发送了获取其他人的请求。如果以前填充了一些数据,则角度似乎会忽略新数据。 如果需要,这是相关代码:

 personModule.controller("PersonDetailsController", function ($scope, $http, dataService, $routeParams) {


var id = $routeParams.PersonId;
var myPromise = dataService.getSpecificPerson(id);
myPromise.then(function (result) {
    var returnedPerson = result;
    if (returnedPerson.AllXml) {
        $scope.OnePerson = JSON.parse(returnedPerson.AllXml);
    }

});

});

   personModule.factory('dataService', function ($http,$q) {

  var deferred = $q.defer();
 var deferred2 = $q.defer();
    var _getPersons= function() {

        $http.post(ROOT + 'Home/GetPersons').
            then(function(data, status, headers, config) {

                deferred.resolve(data.data);

            },function () {
            deferred.reject();
        });
        return deferred.promise;
    }

    var _getSpecificPerson = function (id) {
        var dataString = {
            id:id
        }
        $http.post(ROOT + 'Home/GetPerson', dataString).
           then(function (data, status, headers, config) {
               deferred2.resolve(data.data);
           }, function () {
               deferred2.reject();
           });
        return deferred2.promise;
    }
return {
    getPersons: _getPersons,
    getSpecificPerson:_getSpecificPerson
    }

}); 我尝试将我的范围分配放在 $scope.$apply() 中,但我得到 $digest 已经在进行中: $digest 已经在进行中 编辑:工厂函数从服务返回良好的数据,但是当我在我的控制器内部执行 myPromise.then(function(result){ 时,结果被缓存!(但是当我在工厂方法中使用 console.log(data.data) 时,_getSpecific 人返回-迄今为止的数据!

【问题讨论】:

  • 你能告诉我们returnedPerson中的数据是什么样的吗?是 JSON 吗?
  • 是的,它是 Json...如果我刷新页面,一切都很棒...
  • 但是当我访问 personA 并返回人员列表然后访问 personB 时,我发送请求并获得人员 B 的响应,但 $scope.OnePerson dors 没有在模板中更新。我试过做 $scope.apply 但我没有帮助。

标签: javascript angularjs


【解决方案1】:

我一切都是 JSON 你应该能够写

$scope.OnePerson = returnedPerson.AllXml;

你也可以简化你的服务

var _getSpecificPerson = function (id) {
    var dataString = { id:id };
    return $http.post(ROOT + 'Home/GetPerson', dataString);
}

因为 post 方法返回一个承诺。 在您的控制器中,您必须进行此更改才能使其工作:

var returnedPerson = result.data;

【讨论】:

  • Factory 函数从服务中返回了良好的数据,但是当我执行 myPromise.then(function(result){ 时,我的控制器结果被缓存了!
  • 您确定 $scope.OnePerson 获得了新数据吗?如果您在 if 语句中执行 console.log($scope.OnePerson) 会显示新数据吗?
  • 没有 $scope.OnePerson 获取旧数据,如果我 console.log(data.data) 获取 FRESH 数据,服务器会返回新数据...但在控制器 myPromise.then(function(result). .......结果是旧的。
  • 问题来了,我的promise函数是在faytory方法之前调用的。这怎么可能?
  • 看不到所有代码时,很难看出哪里出了问题。
猜你喜欢
  • 2016-08-23
  • 2020-03-03
  • 2019-02-28
  • 2015-08-11
  • 2017-09-07
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多