2016-03-19 23 views
0

Bir projede açısal 1.5.x kullanıyorum. Paylaşılan peopleService ile iki ayrı denetleyicim var, bunlardan biri (dashboard-controller) insanların listesini görüntüler ve başka bir (people-modal-controller) insanları eklemenizi sağlar. Veri kendini iyi bir şekilde gönderiyor/gönderiyor, ancak şu anda yeni bir kişi eklendiğinde orijinal liste güncellemesine sahip olmakta sorun yaşıyorum. Sidenote: Bunun önemli olup olmadığından emin değilim ama şu anda en iyi uygulamayı takip etmeye çalışıyorum. Denetleyici, $ kapsam yerine sözdizimi olarak. İşte benim kodum.Angular JS içinde vaatlerle hizmetlerin güncellenmesi

insan service.js

logbook.service('peopleService', function($http){ 
var people; 

function getPeople(){ 
    if (angular.isDefined(people)) return $q.when(people); 
    return $http.get('/api/v1/people').then(function(data) { 
     people = data; 
     return people; 
    } 
)}; 

return { 
    getPeople: getPeople(), 
}  
}) 

pano-controller.js

logbook.controller('dashboardController', function($http, $scope, $httpParamSerializerJQLike, peopleService){ 
    var self = this; 
    peopleService.getPeople.then(function(response){ 
    self.people = response.data; 
} 

insan modal-controller.js

logbook.controller('peopleModalController', function($http, $scope, $httpParamSerializerJQLike, ngDialog, peopleService){ 
var self = this; 

self.savePerson = function(person){ 
     $http({ 
     method: 'POST', 
     url: '/api/people', 
     data: $httpParamSerializerJQLike({ 
      'name': person.name, 
     }), 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded' 
     } 
    }).then(function(response){ 
     self.name = null; 
     peopleService.getPeople;    
    }).catch(function(response){ 
     self.formError = response.data.error.message; 
    }) 

index.html

<li ng-repeat="person in dashboard.people.data">{{ person.name }}</li>

+0

, getPeople 'getPeople(), getPeople(),' –

+0

almak için getPeople 'getPeople() olmalıdır,' TypeError: peopleService.getPeople.then konsolda bir işlev değil Bu, denetleyicileri bunu yansıtması için nasıl değiştirmeliyim? – nephenee245

+0

sonra denetleyicinin içinde, 'peopleService.getPeople() gibi işlev çağrısı yapmalısınız.' –

cevap

0

Bunun için ngResource veya benzeri bir modül kullanmanızı öneririz. savePerson işlevi, aynı peopleService'un bir parçası olmalıdır. Ve bu durumda kontrolörler arasındaki kapsamı paylaşmanın avantajını elde edebilirsiniz. Sen Sonra

logbook.controller('dashboardController', function($rootScope, peopleService){ 
    $rootScope.people = []; 
    peopleService.query().$promise.then(function(people) { 
    $rootScope.people = people; 
    }); 
} 

logbook.controller('peopleModalController', function($rootScope, peopleService){ 
self = this; 
self.savePerson = function(person){ 
    var newPerson = new peopleService(person); 
    newPerson.$save().$promise.then(function(person) { 
    $rootScope.people.push(person); 
    }); 
} 

gibi bir şey yapabilirsiniz Ama en iyi yolu

resolve: { 
    people(peopleService) { 
    return peopleService.query().$promise; 
    } 
} 
+0

Teşekkürler, tamamen benim için çalıştı. : P $ düşündüm.RoseScope, bunu yapmak için hacky bir yoldu ama sanırım orada kullanılacak, sanırım? – nephenee245

+0

Başka hiçbir yerde insanları kullanmıyorsanız, sorununuzu çözmesine rağmen, değişkenleri "$ rootScope" a atamak iyi bir uygulama değildir. Uygulamanızı 'peopleModalController' 'dashboardController' içinde olacak şekilde tasarlamanız çok daha iyi ve' $ scope 'değerini devralır. –

0

Ben servis böyle bir şey olmalı bence resolve parametrede router'daki peopleService.query().$promise kullanmaktır :

logbook.service('peopleService', function($http){ 
    var people; 

    function getPeople() { 
     return angular.isDefined(people) ? $q.when(people) : refreshPeople(); 
    }; 

    function refreshPeople() { 
     return $http.get('/api/v1/people') 
      .then(function(data) { 
       people = data; 
       return people; 
      }) 
    }; 

    return { 
     getPeople: getPeople, 
     refreshPeople: refreshPeople 
    }; 
}) 
Bir hizmet içinde 10