【发布时间】:2013-02-05 13:59:01
【问题描述】:
我认为我的 AngularJS 应用程序设计存在缺陷。
我有一项服务,其中包含我的模型项之一以及与添加/删除它们相关的方法。该服务被注入到我的核心应用程序和指令中。我的问题是从指令中删除模型中的项目。我这样做是因为指令物理上代表了每个模型项。变化正在发生,但它并没有推回暴露模型的核心应用程序。我意识到这是因为我没有告诉它更新,但我的问题是我真的不明白如何更新。调用服务后在指令中添加$apply会报错,提示apply已经在进行中,所以感觉这是错误的做法。
我已将我的模型放入服务中,因为我只想要整个应用程序的此数据的单个实例。
谁能提出更好的方法来实现这一点?将模型存储在服务中是个好主意吗?
服务:
angular.module("App").service("widgetService", function () {
this.widgets = [];
this.removeWidget = function() {
<!-- remove item from this.widgets -->
}
this.getWidgets = function() {
return this.widgets;
}
this.setWidgets = function(widgets) {
this.widgets = widgets;
)
}
核心应用:
App.controller("CoreAppController", function($scope, $http, widgetService) {
$scope.widgets = widgetService.getWidgets();
}
HTML:
<widget data-ng-repeat="widget in widgets" />
指令:
myKSS.MyKSSApp.directive("widget", function($compile) {
return {
restrict: "E",
replace: true,
templateUrl: "partials/Widget.html",
scope: {
},
controller: function($scope, $element, $attrs, widgetService) {
$scope.removeWidget = function() {
widgetService.removeWidget();
};
}
}
}
【问题讨论】:
-
您可以改用 $rootScope 来简化您的生活。一般不建议将服务用作数据存储。 $rootScope 已经是页面模型的一部分,并且应该在您更改它时更新所有内容。
-
嗯,谢谢。所以要问一个可能很愚蠢的问题,为什么不建议将数据存储在服务中?我明白为什么 $rootScope 会是一个明智的选择。
-
主要是因为 $rootScope 专门用于存储可以持久保存到所有控制器/视图的数据。并不是说你“不应该”,只是除了一些孤立/私有化之外,这样做通常没有任何优势。
-
我不建议使用
$rootScope。原因之一是违反关注点分离:假设您已将widgets添加到一个模块中的$rootScope 中,并且您希望拥有另一个具有其他widgets的模块。他们都会“污染”rootScope。另一个原因是很难跟踪依赖关系。它还会增加 rootScope 的大小,因此您可以将不同的对象混合在一个地方......关于在服务中存储数据的问题是:stackoverflow.com/questions/14241900/… -
我同意,如果您仅存储数据,那么使用
service是个坏主意——在这种情况下value会好得多。但是在@jwest 问题中,添加/删除小部件时可能会有一些逻辑,可以放在service。
标签: angularjs