0

我正在制作一个主要由来自远程 json 对象的数据驱动的 Angular 网络应用程序。我想用合理的默认数据加载页面,然后请求 json 对象并用这些新数据更新控制器。

这是我所做的服务的一个片段:

clickApp.factory('client', ['$http', function($http){

var logoUrl = "first";

var getConfig = function() {
    logoUrl = "second";

    $http({method: 'GET', url: base_url+'app-config.json'}).
        success(function(data, status) {
            // this callback will be called asynchronously
            // when the response is available
            // console.log("data",data);

            console.log("logopre",logoUrl);
            logoUrl = "third";
            console.log("logopost",logoUrl);
        }).
    error(function(data, status) {
        console.log("error",status);
        // called asynchronously if an error occurs
        // or server returns response with an error status.
    });
};
getConfig();

return {
    logoUrl: logoUrl
}

}]);

我有一个连接到这个的控制器,它暂时用 logoUrl 填充 ap 标签。有了这段代码,p标签立即更新为“second”,“logopre”的日志值为“second”,“logopost”的日志值为“third”,但控制器并未将p标签更新为“第三”如我所料。

我也在我的控制器中尝试了一些花哨的 $scope.$watch 语句,但这并没有改变结果。

编辑我应该注意到,在 $http 请求之后我也尝试了 $rootScope.$apply 但我只能得到“$digest already in progress”错误。

如何正确更新此值,以便在 $http 请求后反映在我的控制器中?

4

1 回答 1

1

尝试这样的事情(http://plnkr.co/edit/Fnrgo4?p=preview):

app.controller('MainCtrl', function($scope, client) {
    $scope.client = client;
    $scope.$watch(function() {
        return client;
    }, function(client) {
        $scope.logoUrl = client.logoUrl;
    }, true);
});

app.factory('client', function($http, $log, $timeout) {
    var obj = {
        logoUrl: "first"
    };
    $log.info("logoinit", obj);
    var getConfig = function() {
            obj.logoUrl = "second";
            $http({
                method: 'GET',
                url: 'app-config.json'
            }).
            success(function(data, status) {
                $log.info("logopre", obj);
                obj.logoUrl = "third";
                $log.info("logopost", obj);
            }).
            error(function(data, status) {
                $log.error("error", status);
            });
        };
    getConfig();

    return obj;
});
于 2013-07-18T01:13:40.440 回答