我在Apache和MySQL的Linux服务器上运行了一个简单的CRUD应用程序。数据库操作由PHP脚本完成。 crud操作正常,服务器与开发机器在不同的机器上。
一切都很好,但是当我尝试在创建,更新或删除操作后列出数据库中的项目时,列表有时会更新,有时则不会更新。
这是代码。
的index.html:
<body ng-controller="GetScenesCtrl">
<ul>
<li ng-repeat="scene in scenes">
<em><a href="#/getscene/{{scene.scene_id}}">{{scene.scene_name}}</a></em>
</li>
</ul>
服务:
angular.module('writServices', ['ngResource'])
.factory('Scenes', function($resource){
return $resource('/:id/:nimi/:sisalto/:pics', {}, {
query: {
url:'php/getscenes.php',
method:'GET',
isArray:true
}
});
App.service('ScenesService', function ($rootScope, Scenes) {
var scenes = [];
this.setScenes = function() {
scenes = Scenes.query();
$rootScope.$broadcast('updscenes', scenes);
};
this.getScenes = function() {
scenes = Scenes.query();
return scenes;
};
});
控制器:
App.controller('GetScenesCtrl', function($scope, Scenes, ScenesService) {
$scope.scenes = Scenes.query();
//$scope.scenes = ScenesService.setScenes();
//$scope.scenes = ScenesService.getScenes();
//$scope.$on('updscenes', function(event, scenes) {
// $scope.scenes = scenes;
//});
$scope.updateScenes = function() {
$scope.scenes = Scenes.query();
};
});
好的,所以当index.html第一次加载时,我使用Scenes.query()方法来初始化列表。在CRUD操作之后调用updateScenes()-method以更新范围。此呼叫来自另一个控制器。像这样:
App.controller('AddSceneCtrl', function($scope, Scenes, ScenesService) {
$scope.addScene = function(scene) {
Scenes.add({
nimi : scene.name,
sisalto : scene.content
});
$scope.updateScenes();
//$scope.scenes = ScenesService.getScenes();
//ScenesService.setScenes();
}
});
更新我尝试过的范围的另一种方法是广播方式,两种方式的工作方式类似,使列表有时不会更新。为什么是这样?这样做必须有更好的方式,Angular方式。我是Angular的新手,所以我必须在这里找到一些东西。
石
答案 0 :(得分:2)
要跟进@Duncan的评论,这里是the documentation的引用:
重要的是要意识到调用$ resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。具有空对象导致无渲染,一旦数据从服务器到达,则对象用数据填充,并且视图自动重新呈现其自身显示新数据。这意味着在大多数情况下,永远不必为动作方法编写回调函数。
可以使用以下参数调用类对象或实例对象上的操作方法:
HTTP GET "class" actions: Resource.action([parameters], [success], [error])
non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
non-GET instance actions: instance.$action([parameters], [success], [error])
使用(value,responseHeaders)参数调用成功回调。使用(httpResponse)参数调用错误回调。
所以,你应该这样做:
Scenes.add(
{
nimi : scene.name,
sisalto : scene.content
},
function() { // this function is invoked when the add is successful
$scope.updateScenes();
});
或者只是
Scenes.add(
{
nimi : scene.name,
sisalto : scene.content
},
$scope.updateScenes);