2013-02-05 2 views
1

내 AngularJS 앱의 디자인에 결함이 있다고 생각합니다.AngularJS - 지시어에서 서비스 기반 모델 업데이트

모델 항목 중 하나와 추가/삭제와 관련된 메소드가 포함 된 서비스가 있습니다. 이 서비스는 핵심 애플 리케이션과 지시문에 주입됩니다. 내 문제는 지시문에서 모델의 항목을 제거하는 것입니다. 지시문이 각 모델 항목을 물리적으로 나타 내기 때문에이 작업을 수행하고 있습니다. 변화가 일어나고 있지만, 모델을 드러내는 핵심 앱으로 되돌아 가지 않습니다. 업데이트가 필요하다고 알려주지 않았기 때문에 이것이 사실임을 알고 있습니다.하지만 문제는 실제로 어떻게하는지 이해할 수 없습니다. 서비스를 호출 한 후 $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(); 
      }; 
     } 
    } 
} 
+0

대신 $ rootScope를 사용하면 생활을 단순화 할 수 있습니다. 일반적으로 서비스를 데이터 저장소로 사용하지 않는 것이 좋습니다. $ rootScope는 이미 페이지의 모델의 일부이며, 사용자가 변경하면 모든 것을 업데이트해야합니다. –

+0

흠, 고마워. 어쩌면 어리석은 질문을 던지기 위해 왜 서비스에 데이터를 저장하지 않는 것이 좋을까요? 나는 왜 $ rootScope가 합리적인 대안이 될 수 있는지 알 수있다. – jwest

+0

대부분 $ rootScope는 모든 컨트롤러/뷰에 유지할 수있는 데이터를 저장하기 위해 특별히 설계 되었기 때문입니다. 당신이 "절대로"해서는 안된다는 것이 아닙니다. 단지 고립/민영화 밖에서 그렇게하는 것이 일반적으로 이점이 없다는 것입니다. –

답변

0

내가 통지를했습니다 한 가지있다 : 당신이 서비스의 widgets 변수의 값을 변경할 수있는 가능성을주지해야한다 - 그렇지 않으면 추가/제거 추적 할 수

(I 제거되어야 할 서비스의 this.setWidgets 방법을 의미) 그 밖의 다른 것들은 (다른 약간의 변경과 함께) 작동해야합니다 : http://plnkr.co/edit/fQMwfI5d7nikjhXTXSC6?p=preview

+0

감사합니다. Valentyn, 내가 원했던대로 정확하게 작동합니다. 그러나 이것은 흥미 롭습니다 - 왜 당신은 서비스가 아닌 컨트롤러에 아이템을 추가 할 것입니까? 확실히 이것은 모든 관련 기능을 서비스에 캡슐화하지 않습니다. 이것은 본질적으로 내가 서비스에서 모델을 가져서는 안된다는 것을 말해줍니다. – jwest

+0

나는 plunker를 업데이트하여 어레이의 실제 수정을 서비스로 옮겼으므로 위젯을 추가하는 방법을 숨기고 있습니다. –

+0

이 질문을 게시하기 전에 내 코드는 거의 동일합니다. 눈에 띄는 차이점은 없지만 항목을 제거해도보기가 업데이트되지 않습니다. 나는 문제가 생기면 해결하려고 노력할 것입니다. 감사. – jwest

관련 문제