Как обновить мою область $ $ после добавления новых элементов?

У меня проблема с моим контроллером. Я использую ионные (угловые) и js-данные. когда я добавляю новый элемент через addItem() Я только когда увижу это, если я перезагрузить страницу через F5.

Вот мой код:

.controller('FooCtrl', function($scope, $ionicPlatform, foo) {
    $ionicPlatform.ready(function() {
        foo.findAll().then(function (items) {
            $scope.items = items;
        });
    });

    $scope.item = {};
    $scope.addItem = function () {
        foo.create({ name: $scope.item.name });
    };
})

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

4 ответа

Решение

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

foo.findAll().then(function (items) {
                $scope.items = items;
            });

используйте этот код:

.controller('FooCtrl', function($scope, $ionicPlatform, foo) {
    $ionicPlatform.ready(function() {
        foo.findAll().then(function (items) {
            $scope.items = items;
        });
    });

    $scope.item = {};
    $scope.addItem = function () {
        foo.create({ name: $scope.item.name });
        $scope.items.push({ name: $scope.item.name });
    };
})

или же

.controller('FooCtrl', function($scope, $ionicPlatform, foo) {
    $ionicPlatform.ready(function() {
        foo.findAll().then(function (items) {
            $scope.items = items;
        });
    });

    $scope.item = {};
    $scope.addItem = function () {
        foo.create({ name: $scope.item.name });
           foo.findAll().then(function (items) {
                $scope.items = items;
            });
    };
})

Вы не храните созданный элемент нигде в вашем контроллере. Я предполагаю, что foo.create возвращает элемент, я прав? Если это так, возможно, что-то вроде этого может работать:

$scope.addItem = function () {
    var item = foo.create({name: $scope.item.name});
    // this assumes that $scope.items is an array
    $scope.items.push(item);
};

Если вы используете js-data-angular, то вы также можете сделать:

.controller('FooCtrl', function($scope, $ionicPlatform, foo) {
  $ionicPlatform.ready(function() {
    // retrieve that initial list of items
    foo.findAll();

    // $scope.items will be kept up-to-date with
    // the foo items in the store
    foo.bindAll(null, $scope, 'items');
  });

  $scope.item = {};
  $scope.addItem = function () {
    // thanks to the bindAll above, the
    // created item will be rendered
    // automatically
    foo.create({ name: $scope.item.name });
  };
})

Это может решить проблему:

 foo.findAll().then(function (items) {
            $scope.items = items;
            $scope.$apply();
        });
Другие вопросы по тегам