2016-03-14 3 views
0

У меня есть объект вроде этого:AngularJS объект не обновляя

.controller('lineCtrl', function($sessionStorage, $rootScope, $scope, $stateParams, $state, $filter, config, $http, SCAN_EVENT, $ionicLoading, $ionicPopup, ScanService){ 

     var areaName; 
     var lineCounts; 

     function filterObjects() { 
      switch ($stateParams.area) { 

       case 'PW': 
        $scope.items = $filter('filter')($rootScope.runnerItemsPW, {line: $stateParams.line}, true); 
        areaName = "Putwall"; 
        lineCounts = $rootScope.lineCountPW; 
        break; 
       case 'NC': 
        $scope.items = $filter('filter')($rootScope.runnerItemsNC, {line: $stateParams.line}, true); 
        areaName = "Non-Con"; 
        lineCounts = $rootScope.lineCountNC; 
        break; 
       case 'RE': 
        $scope.items = $filter('filter')($rootScope.runnerItemsRE, {line: $stateParams.line}, true); 
        areaName = "Receiving"; 
        lineCounts = $rootScope.lineCountRE; 
        break; 
       case 'SP': 
        $scope.items = $filter('filter')($rootScope.runnerItemsSP, {line: $stateParams.line}, true); 
        areaName = "Singles Pack"; 
        lineCounts = $rootScope.lineCountSP; 
        break; 
       default: 
        break; 
      } 
     } 

     filterObjects(); 

     $rootScope.lineData = { 
      position: 1, 
      lineNumber: $stateParams.line, 
      area: $stateParams.area, 
      areaName: areaName, 
      lineCounts: lineCounts, 
      items: $scope.items 
     }; 

     $scope.clearLine = function(){ 
      ScanService.dispatch(String("00" + $rootScope.lineData.lineNumber).slice(-2) + 'DONE'); 
     }; 

     $scope.removeStationItems = function (stationdID, createdDateTime){ 
      var url = config.baseURL + "/runner/removeDesktopRunnerItem/" + stationdID + "/" + createdDateTime.split(' ').join('_') + "/" + $sessionStorage.user.loginName; 
      $http.get(url).then(function(response){ 
       if(response.status === 200 && response.statusText === "OK"){ 
        var data = response.data; 
        if(data === ''){ 
         $state.go($rootScope.prevState); 
         $rootScope.setObjects(data); 
         filterObjects(); 
        }else{ 
         $rootScope.setObjects(data); 
         filterObjects(); 
         var found = $filter('getByStationID')(data.runnerItems, $rootScope.lineData.lineNumber); 
         if(found === null){ 
          $state.go($rootScope.prevState); 
         } 
        } 
       } 
      }) 
     }; 

    }) 

.controller('queue', function ($rootScope, $http, $filter, $scope, config, $interval, $ionicLoading) { 

     $rootScope.setObjects = function (data){ 
      $rootScope.runnerItemsPW = $filter('filter')(data.runnerItems, {areaShort: "PW"}); 
      $rootScope.lineCountPW = $filter('filter')(data.lineCounts, {areaShort: "PW"}); 
      $rootScope.runnerItemsRE = $filter('filter')(data.runnerItems, {areaShort: "RE"}); 
      $rootScope.lineCountRE = $filter('filter')(data.lineCounts, {areaShort: "RE"}); 
      $rootScope.runnerItemsNC = $filter('filter')(data.runnerItems, {areaShort: "NC"}); 
      $rootScope.lineCountNC = $filter('filter')(data.lineCounts, {areaShort: "NC"}); 
      $rootScope.runnerItemsSP = $filter('filter')(data.runnerItems, {areaShort: "SP"}); 
      $rootScope.lineCountSP = $filter('filter')(data.lineCounts, {areaShort: "SP"}); 
      }; 

    }); 

Когда контроллер первым начал $scope.items добавляется к объекту и работает просто отлично. Строка $scope.items обновляется, когда появляются новые данные. Однако ng-repeat, который у меня есть для lineData.items, не обновляется.

+2

Просьба показать все соответствующие коды. Недостаточно показало, чтобы диагностировать любые проблемы. – charlietfl

+0

Добавлен код для каждого контроллера. –

ответ

0

Вы назначаете только $rootScope.lineData один раз в функции инициализации контроллера. Эта функция вызывается только один раз во время процесса начальной загрузки.

Вам необходимо назначить его в своей функции filterObjects, чтобы он обновлялся по вашему вызову $http. Это означает, что вам нужно создать его перед вызовом filterObjects в первый раз. Как это:

$rootScope.lineData = { 
    position: 1, 
    lineNumber: $stateParams.line, 
    area: $stateParams.area, 
    areaName: areaName, 
    lineCounts: lineCounts, 
}; 

function filterObjects() { 
    switch ($stateParams.area) { 
     case 'PW': 
      $rootScope.lineData.items = $scope.items = $filter('filter')($rootScope.runnerItemsPW, {line: $stateParams.line}, true); 
      areaName = "Putwall"; 
      lineCounts = $rootScope.lineCountPW; 
      break; 
     // etc. 
    } 
} 

filterObjects(); 
1

$ filter создает новый объект, поэтому необходимо обновить $ rootScope.lineData. Обновите $ rootScope.lineData снова после фильтра.

+0

Хорошо, не могли бы вы привести пример. Я пытался понять это в течение нескольких дней, и я в тупике. –

+0

Позвольте мне создать plunkr. Дай мне немного времени. – Dhiren

+0

Проверьте ответ Джеком. он делает то же самое. В принципе, $ filter создает новый объект, поэтому вам нужно переназначить его до $ rootScope.lineData.Items – Dhiren

-2

В $ http код ответа добавить строку $ scope. $ Apply(); после вызова функции filterObjects()

+0

К сожалению, это не сработало, я получаю ошибку инжектора. –

+0

Он уже вызван внутренне, и это приведет к ошибке 'digest in progress'. Проблема в OP-коде - это нарушение ссылок на объекты. – charlietfl

1

Вы нарушаете исходную ссылку на объект, когда вы переназначить $scope.items поэтому исходная ссылка передается объекту lineData больше не такой же, как массив, на который ссылается $scope.items

Простой пример

var myArray = [1,2,3]; 

var obj={ 
    items: myArray // reference to array above 
} 
console.log(myArray); // [1,2,3] 
console.log(obj.items); // [1,2,3] - exact same object reference as myArray 

// now reassign myArray with new object reference 
myArray =[6,7,8]; 

console.log(myArray); // [6,7,8] 
console.log(obj.items); // [1,2,3] - the original reference hasn't changed 

// now reassign object property value to new array 
obj.items = myArray ; 
console.log(obj.items); // [6,7,8] - references new array 

ПРИМЕЧАНИЕ: вы должны использовать службу для обмена данными и методами между контроллерами.

Смежные вопросы