我的问题是larger program的一部分,但我用简单的jsfiddle提取了问题的模拟。
我正在为待办事项实施“详细视图”显示/隐藏控制器。当我点击链接时,会显示或隐藏详细视图。详细视图状态存储在todo.showDetails
中。这工作正常。
// Persist immediately as clicked on
$scope.checkTodo = function (todo) {
todo.$save();
};
这使我的详细视图去隐藏的todo.showDetails
状态丢失,因为它不是持续的一部分:
当我标记为已完成待完成,我坚持用服务器的当前状态项目(即,它会覆盖服务器对todo项目的视图,该项目不包含UI状态todo.showDetails
)。我并不感到惊讶,这是有道理的。
我的问题是:我的待办事项如何包含本地用户界面状态和数据保存在服务器上?当我todo.$save()
,我想todo
的数据被保存在服务器而在客户端代码中保留todo.showDetails
的值。即,每当我打电话给todo.$save()
时,我都希望我的UI状态保持不变。
在AngularJS中有这样做的习惯吗?我不想在服务器上保存UI值(如showDetails
)。
我一直在想着实现这一点的一种方式是有一个单独的服务,为每个待办事项存储UI状态。当我需要访问本地状态,而不是像todo.showDetails
那样访问时,我可以执行类似AppState.lookup(todo.id).showDetails
或类似的操作。但也许还有一个更简单的方法..
- 更新2013年2月25日 -
我一样从待办事项以下answer和简单的分离UI状态由$ resource.get创建/查询呼叫。这是比我想象的要简单得多(见commit):
我的控制器的变化:
$scope.todos = Todo.query();
+ $scope.todoShowDetails = [];
+ $scope.toggleShowDetails = function (todo) {
+ $scope.todoShowDetails[todo.id] = !$scope.todoShowDetails[todo.id];
+ }
+
+ $scope.showDetails = function (todo) {
+ return $scope.todoShowDetails[todo.id];
+ }
模板变化:
- <label class="btn btn-link done-{{todo.done}}" ng-click="todo.showDetails = !todo.showDetails">
+ <label class="btn btn-link done-{{todo.done}}" ng-click="toggleShowDetails(todo)">
..
- <div ng-show="todo.showDetails" ng-controller="TodoItemCtrl">
+ <div ng-show="showDetails(todo)" ng-controller="TodoItemCtrl">
很简单,当我把它放在代码。我的jsfiddle例子有点做作,它在我的待办应用程序的上下文中更有意义。也许我应该删除这个问题,如果它难以理解或者太琐碎?
你总是可以使用普通的$ HTTP模块(也许在你自己的指令把它包),而不是$资源.. – mb21 2013-02-24 21:00:22
真的不清除你的问题是什么 – charlietfl 2013-02-24 22:50:30