【问题标题】:AngularJS - updating service-based model from directiveAngularJS - 从指令更新基于服务的模型
【发布时间】: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


【解决方案1】:

我注意到一件事:您不应该更改 widgets 服务变量的值 - 否则您无法跟踪添加/删除(我的意思是 this.setWidgets 服务方法应该是删除)

其他一切都应该可以工作(有一些其他的小改动):http://plnkr.co/edit/fQMwfI5d7nikjhXTXSC6?p=preview

【讨论】:

  • 感谢 Valentyn,这确实完全符合我的要求。但是,这很有趣——为什么要在 Controller 而不是 Service 中添加项目?当然,这不会将所有相关功能封装到服务中吗?这本质上是在告诉我,我不应该在服务中拥有该模型。
  • 我已经更新了 plunker 将数组的实际修改移到了服务中,因此隐藏了在那里添加小部件的方式。
  • 我在发布这个问题之前的代码几乎是相同的。我看不到明显的差异,但删除项目不会更新视图。如果我有任何问题,我会尝试解决并发布更新插件。谢谢。
  • 啊!我的代码中的一个简单错误最终让我认为它根本不起作用。问题已解决!
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
相关资源
最近更新 更多