angularjs - Refresh controller when factory data updated -


i have factory:

function perioddataservice (apiservice) {      var perioddata = {}      perioddata.refresh = function(user) {         apiservice.query({ route:'period', id: user._id }, function(data) {             perioddata.orders = data[0].orders         })     }     perioddata.orders = []     perioddata.preiod = 1      return perioddata   } angular     .module('app')     .factory('perioddataservice', perioddataservice) 

and controllers...for example one, use factory data

function productionctrl ($scope, perioddataservice) {      $scope.board = perioddataservice.board     $scope.period = perioddataservice.period } angular     .module('loop')     .controller('productionctrl', productionctrl) 

when call refresh, controlles dont update there data. whats reason?

perioddataservice.refresh(user) 

thank you!

the problem that, when call refresh , service does

perioddata.orders = data[0].orders 

your service changing perioddata.orders property point different array 1 set point when initialized (via perioddata.orders = []).

this breaks connection between controller , data array in service because controller set point original array when did

$scope.orders = perioddataservice.orders 

(which don't see in sample code assume you're doing somewhere).

this set $scope.orders equal same pointer perioddata.orders, pointing original array in memory, , allowing controller see changes array.

when service changes perioddata.orders different pointer, nothing changes pointer value of $scope.orders, it's still pointing original array, hasn't changed.

there different ways can fix this.

approach 1

you have service .push() new data perioddata.orders rather set perioddata.orders equal returned data array. refresh method this:

perioddata.refresh = function(user) {     apiservice.query({ route:'period', id: user._id }, function(data) {         perioddata.orders.length = 0; // empty current orders array          // push returned orders data orders array         data[0].orders.foreach(function (item, index) {             perioddata.orders.push(item);         });     }); }; 

as long add or remove original array, , don't redefine (don't ever perioddata.orders =), should work fine.

approach 2

alternatively, create new object hold orders array (and other data elements want expose) , have $scope property pointing object rather array itself.

so service this:

function perioddataservice (apiservice) {     var perioddatasvc = {};      // create data object hold service data     perioddatasvc.perioddata = {         orders: [],         period: 1     };      perioddatasvc.refresh = function(user) {         apiservice.query({ route:'period', id: user._id }, function(data) {             perioddatasvc.perioddata.orders = data[0].orders         })     }      return perioddatasvc; } 

with orders array 1 level deeper @ perioddatasvc.perioddata.orders.

and have $scope property pointing perioddata object rather orders array:

function productionctrl($scope, perioddataservice) {     $scope.perioddata = perioddataservice.perioddata; } 

so in service, when set orders array equal returned array apiservice, controller see change because it's watching perioddata object, , property on object has changed.

and of course, since changed $scope property, markup referencing orders array need change reference perioddata.orders instead. example:

<div ng-repeat="order in perioddata.orders">{{order.id}}: {{order.item}}</div> 

here's fiddle showing both approaches.


Comments

Popular posts from this blog

c++ - QTextObjectInterface with Qml TextEdit (QQuickTextEdit) -

javascript - angular ng-required radio button not toggling required off in firefox 33, OK in chrome -

xcode - Swift Playground - Files are not readable -