31

我想显示一个包含与编辑项目对应的数据的表单。我ui-router用于路由。我定义了一个状态:

myapp.config(function($stateProvider) {

    $stateProvider.
    .state('layout.propertyedit', {
        url: "/properties/:propertyId",
        views : {
            "contentView@": {
                templateUrl : 'partials/content2.html', 
                controller: 'PropertyController'
            }
        }
    });

PropertyController中,我想$scope.property使用来自以下调用(Google Cloud Endpoints)的数据进行设置:

    gapi.client.realestate.get(propertyId).execute(function(resp) {
        console.log(resp);
    });

不知道能不能用resolve,因为数据是异步返回的。我试过了

    resolve: {
        propertyData: function() {
            return gapi.client.realestate.get(propertyId).execute(function(resp) {
                console.log(resp);
            });
        }
    }

第一个问题,propertyId未定义。你如何propertyIdurl: "/properties/:propertyId"?

基本上我想设置异步调用返回的$scope.property对象。PropertyControllerresp

编辑:

myapp.controller('PropertyController', function($scope, , $stateParams, $q) {

    $scope.property = {};

    $scope.create = function(property) {
    }

    $scope.update = function(property) {
    }

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

    gapi.client.realestate.get({'id': '11'}).execute(function(resp) {
        deferred.resolve(resp);
    });

    $scope.property = deferred.promise;
}

});
4

4 回答 4

56

您需要阅读解决文档的文档。Resolve 函数是可注入的,您可以使用$stateParams它从路由中获取正确的值,如下所示:

resolve: {
    propertyData: function($stateParams, $q) {
        // The gapi.client.realestate object should really be wrapped in an
        // injectable service for testability...

        var deferred = $q.defer();

        gapi.client.realestate.get($stateParams.propertyId).execute(function(r) {
            deferred.resolve(r);
        });
        return deferred.promise;
    }
}

最后,解析函数的值一旦解析就可以注入到控制器中:

myapp.controller('PropertyController', function($scope, propertyData) {

    $scope.property = propertyData;

});
于 2013-08-02T14:50:09.203 回答
1

I think your controller function needs $stateParams parameter from which you can get your propertyId. Then you can use $q parameter and create promise to set $scope.property with something like this:

var deferred = $q.defer();

gapi.client.realestate.get(propertyId).execute(function(resp) {
    deferred.resolve(resp);
});

$scope.property=deferred.promise;

Here is description of using promises for handling async calls.

于 2013-08-01T21:10:49.457 回答
1

尝试这种简单的方法以正确的方式使用解决方案

国家代码:


.state('yourstate', {
                url: '/demo/action/:id',
                templateUrl: './view/demo.html',
                resolve:{
                    actionData: function(actionData, $q, $stateParams, $http){
                       return actionData.actionDataJson($stateParams.id);
                    }
                },
                controller: "DemoController",
                controllerAs : "DemoCtrl"
            })

在上面的代码中,我正在发送我在 url 中发送的参数数据,例如,如果我这样发送,/demo/action/5 这个数字 5 将用于actionData服务该服务检索一些基于 id 的 json 数据。最后,该数据将存储到actionData您可以使用通过使用该名称直接在您的控制器中

以下代码根据在状态级别传递的 id 返回一些 JSON 数据


(function retriveDemoJsonData(){

    angular.module('yourModuleName').factory('actionData', function ($q, $http) {

        var data={};
        data.actionDataJson = function(id){
           //The original business logic will apply based on URL Param ID 
            var defObj = $q.defer();
            $http.get('demodata.json')
                .then(function(res){
                     defObj.resolve(res.data[0]);
                });
            return defObj.promise;  
        }
        return data;
    });

})();

于 2016-11-19T07:32:50.757 回答
0

How about this:

function PropertyController($scope, $stateParams) {
   gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) {
     $scope.property = resp;
   });
}
于 2013-08-01T21:11:10.037 回答