2016-09-07 4 views
0

У меня есть некоторые проблемы с попыткой повторного рендеринга модели таблицы, когда я обновляю элемент внутри этой таблицы, вы вызываете http-api, который отредактирует этот элемент, а затем, когда будет выполнен обратный вызов вызовет тот же api, чтобы получить обновленный список элементов, на самом деле он работает нормально, но единственная проблема, которая не обновляет таблицу с новой информацией.angularjs not refreshing table

За то, что я знаю, запрос HTTP заботится $ применять, но это отчасти запутать

здесь я за столом, где я есть нг-повтора для каждого элемента в списке, который я получил:

<table cellspacing="0" class="table table-small-font table-bordered table-striped"> 
         <thead> 
          <tr> 
           <th data-i18n="_maintainer_devices_table_devices_column_code"></th> 
           <th data-i18n="_maintainer_devices_table_devices_column_type"></th> 
           <th data-i18n="_maintainer_devices_table_devices_column_status"></th> 
           <th data-i18n="_maintainer_devices_table_devices_column_action"></th> 
          </tr> 
         </thead> 
         <tbody class="middle-align"> 
          <tr ng-repeat="(key, value) in devicesList"> 
           <td>{{value.code}}</td> 
           <td>{{value.type.name}}</td> 
           <td>{{value.status.name}}</td> 
           <td ng-controller="UIModalsCtrl"> 
            <button class="btn btn-icon btn-white btn-xs"> 
             <i class="fa fa-truck"></i> 
            </button> 
            <button class="btn btn-icon btn-white btn-xs" ng-click="openModal('maintainer_modal', 'md','',{'title': 'Edit','action': 'edit'},value);" tooltip="Tooltip on bottom" tooltip-placement="bottom"> 
             <i class=" fa fa-pencil"></i> 
            </button> 
            <button class="btn btn-red btn-icon btn-icon-standalone btn-xs" ng-click="openModal('confirm_modal', 'md','',{'title': 'Delete','action': 'delete'},value);"> 
             <i class="fa fa-trash-o"></i> 
             <span data-i18n="_button_delete"></span> 
            </button> 
           </td> 
          </tr> 
         </tbody> 
        </table> 

deviceService.js

traceItServices.service('$deviceMaintainer', function($http) { 
var call = function(data, action, callback) { 
    var url = 'http://171.16.0.4:1337/maintainer/devices/' + action; 
    showLoadingBar({ 
     pct: 100, 
     delay: 1, 
     before: function(pct) { 
      $http.post(url, data).success(function(data, status, headers, config) { 
       callback(data); 
      }); 
     } 
    }); 
}; 

this.get = function(data, callback) { 
    call(data, 'get', function(data) { 
     callback(data); 
    }); 
} 

this.update = function(data, callback) { 
    call(data, 'update', function(data) { 
     callback(data); 
    }); 
} 

.. .


deviceController.js

traceitApp.controller('devicesCtrl', ['$scope', '$rootScope', '$http', '$timeout', '$messages', '$deviceMaintainer', '$translator', 
    function($scope, $rootScope, $http, $timeout, $messages, $deviceMaintainer, $translator) { 
     ....... 
     $scope.getUserDevices = function() { 
      var data = { 
       user_id: $rootScope.userInfo.userId 
      }; 

      $deviceMaintainer.get(data, function(dataOut) { 
       var list = JSON.parse(dataOut.response).devices.device; 
       list = $translator.translateDevicesList(list); 
       $timeout(function() { 
        $scope.devicesList = list; 
       }, 1) 

      }); 
     }; 

     $scope.updateDevice = function() { 
      var data = { 
       device_code: $scope.device_code, 
       device_type_id: $scope.device_type_id, 
       device_id: $scope.device_id 
      }; 

      $deviceMaintainer.update(data, function(dataOut) { 
       try { 
        var res = JSON.parse(dataOut.response); 
        if (res.result.id > 0) { 
         $messages.success($translator.localize.getLocalizedString('_message_success')); 
        } 

        $scope.getUserDevices(); 

       } catch (e) { 
        console.log(e.message); 
       } 
      }); 
     }; 
    } 
]); 

спасибо заранее.

ответ

0

я обнаружил, что я использовал $ scope.devicesList = список и по какой-то причине он не обновлять его, но вместо этого, я использовал $ rootScope.devicesList = список и вдруг, он работал. . Теперь, когда я ничего менять и обновлять его обновить ...

благодарит ребят =)


UPDATE:

Я понял, почему это не работает, дело в том, что я позвонил в deviceCtrl-> update из модального, и модальный, так что этот же диалог имеет различную область действия deviceCtrl, поэтому, когда я обновил список , он не изменился, потому что он не был в той же области, поэтому, чтобы исправить это, мне пришлось добавить переменную в модальный контроллер, содержащий родительский элемент.

var parent = $ scope. $ Parent; ($ scope, введенный в модульный контроллер).

Таким образом, родительский путь будет исходной областью deviceCtrl.

так, чтобы это было исправлено, было трудно понять, чтению и чтению я придумал это. Благодарим всех.

+0

Из любопытства у вас есть контроллер для всей таблицы или это только в пределах области применения? Я бы настоятельно предложил не привязывать данные таблицы (особенно) к $ rootScope, потому что все дети $ rootScope получат копию. Если вы создадите новую область (добавив контроллер вокруг таблицы), вы сможете изолировать данные таблицы до одной области. – kondrak

+0

Да, на самом деле это только одна область для стола. Его deviceController, который сохраняет эту область для себя. Я думал то же самое, но это не сработало. И я все еще пытаюсь понять, как заставить его работать только с $ scope, а не с $ rootScope. -.- – Chris

0

На самом деле, вы даже используете $ timeout. В соответствии с Angular $scope.$apply vs $timeout as a safe $apply это вызывает $ apply после текущего дайджеста.

Итак, рендеринг выглядит хорошо. Вы уверены, что у вас действительно есть новые данные? Я думаю, вы уже отлаживали обратные вызовы.

+0

haha ​​да, это смешно, потому что я получаю новые данные каждый раз, когда я обновляю строку, на самом деле, когда я открываю модальное обновление, после того, как я обновляюсь один раз, он показывает мне обновленные данные, например, если я изменяю код одного устройство, я нажимаю «Сохранить», затем он приносит мне данные с обновленным кодом, я видел это в журнале, поэтому idk, что может произойти ... – Chris