2013-08-01 32 views
28
Veri Düzenlenen öğeye karşılık gelen bir form görüntülemek istediğiniz

ile asenkron veri almak. Yönlendirme için ui-router kullanıyorum. Ben resolve kullanabilir miyim bilmiyorumAçısal ui-yönlendirici kararlılığının

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

: Ben veriler aşağıdaki çağrı (Google Bulut Endpoints) gelen ile $scope.property ayarlamak istediğiniz PropertyController yılında

myapp.config(function($stateProvider) { 

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

: Ben bir devlet tanımlı Çünkü veriler eşzamansız olarak döndürülür. Ben propertyId tanımsız,

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

İlk sayı

çalıştı. propertyId'u url: "/properties/:propertyId"'dan nasıl edinirsiniz?

Temel olarak, async çağrısı tarafından döndürülen resp nesnesine PropertyController içinde $scope.property değerini ayarlamak istiyorum.

DÜZENLEME:

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; 
} 

}); 
+1

bir jsfiddle ekleyin lütfen. – zsong

cevap

52

Sen the docs for resolve okumak gerekir. Çöz işlevleri enjekte vardır ve bu yüzden gibi, yolları doğru değeri almak için $stateParams kullanabilirsiniz:

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; 
    } 
} 

Son olarak çözülmesine fonksiyonları için değerler kez çözüldü controller içerisinde enjekte şunlardır:

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

    $scope.property = propertyData; 

}); 
+1

'deferred.resolve' denir ancak denetleyici çağrılmaz. Sözün sıkıştığı anlaşılıyor. Eşzamansız çağrımı "deferred.resolve (" resolved ")' ile değiştirirsem, denetleyici çağrılır. Herhangi bir fikir? – Sydney

+0

Herhangi bir nedenden dolayı, $ rootScope'u çağırmak zorunda kaldım. $ Apply(); 'deferred.resolve' sonra – Sydney

+3

Angular'ın vaat sisteminin kapsam sisteminin sindirim döngüsüne bağlanması nedeniyle. Angular'ın vaatlerini kullanan yerleşik API'lerin tümü için, bu sizin için halleder. Dış senkronize olmayan API'leri kullanırken kapsamı kendiniz yenilemeniz gerekir. –

1

Ben senin denetleyici işlevi size propertyId alabilirsiniz hangi $stateParams parametreyi ihtiyacı var. Sonra böyle bir şey ile $scope.property ayarlamak için söz $q parametresini kullanın ve oluşturabilirsiniz:

var deferred = $q.defer(); 

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

$scope.property=deferred.promise; 

Burada zaman uyumsuz aramaları işlemek için description of using promises olduğunu. Bu nasıl hakkında

+0

'PropertyController' zaten var, yani denetleyici işlevi' controller: işlev PropertyController ($ scope, $ stateParams) 'kullanarak, yeni bir' PropertyController' oluşturuyor mu yoksa mevcut olanı mı kullanıyor? – Sydney

+0

Varsa nasıl görünüyor? – efan

+0

Geçerli denetleyici hakkındaki düzenlemeye bakın – Sydney

0

:

function PropertyController($scope, $stateParams) { 
    gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) { 
    $scope.property = resp; 
    }); 
} 
+0

"PropertyController" zaten var, bu yüzden kontrolör işlevini kullanarak 'controller: işlev PropertyController ($ scope, $ stateParams)', yeni bir 'PropertyController' oluşturuyor mu yoksa mevcut olanı mı kullanıyor? – Sydney

1
uygun şekilde kararlılığını kullanmak için bu kolay bir yol deneyin

Devlet kodu:


Ben örnekler için ben url gönderiyorum parametre verilerini, yolluyorum Yukarıdaki kodda
.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" 
      }) 

i bu sayı 5 servis dayalı bazı json veri almak actionData hizmetine gidecek bu /demo/action/5 gibi gönderirseniz İD.Son olarak bu veri actionData içine saklayacak Sen devlet düzeyinde geçen IAM kimliği temel direk kod dönüşünden sonra bazı JSON veri bu ismi

kullanarak denetleyicisi odasını kullanabilirler


(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; 
    }); 

})();