2014-09-12 3 views
0

У меня есть следующая проблема. Существует служба, которая отвечает за сохранение определенного идентификатора объекта. И когда объект выбран, $ rootScope передает событие, чтобы уведомить задействованного контроллера.

var SelectedObjectFactory = function (objectsFactory, $rootScope) { 
     var selectedObjectId; 
     var selObjFactory = {}; 
     selObjFactory.SelectObject = function (objectID) { 
      selectedObjectId = objectID 
      $rootScope.$broadcast("ObjectSelected", { selectedId: selectedObjectId }); 
      }; 
     selObjFactory.GetSelectObjectId = function() { 
     return selectedObjectId; 
    }; 
     return selObjFactory; 
    }; 
    SelectedObjectFactory.$inject = ['objectsFactory', '$rootScope']; 
    app.factory("selectedObjectFactory", SelectedObjectFactory); 

И я использую $ scope.attachedProperties в связи с нг-повтора, чтобы создать список свойств.

var FormController = function ($scope, selectedObjectFactory, eventPropertiesFactory) { 
     $scope.$on("ObjectSelected", function (event, selectedObject) { 
     $scope.attachedProperties =  eventPropertiesFactory.GetPropertiesForEventById(selectedObject.selectedId); 
    }); 
} 

FormController.$inject = ['$scope', 'selectedObjectFactory', 'eventPropertiesFactory']; 
angular.module("svgObjectsApp").controller("FormController", FormController); 

И я использую $ scope.attachedProperties в связи с нг-повтора, чтобы создать список свойств.

<div class="col-lg-3" ng-controller="FormControler"> 
    <table> 
     <tbody> 
      <tr ng-repeat="property in attachedProperties"> 
       <td class="col-lg-6 tabletitle">{{property.propertyName}}</td> 
       <td class="col-lg-6"><input type="text" value={{property .propertyValue}}/>    </td> 
       </tr> 
     </tbody> 
    </table> 
</div> 

В контроллере $ scope. $ On работает нормально. В инструменте разработчика я вижу, что все переменные обновляются.

  1. Проблема в списке в html не создана. Я предполагаю, что мне не хватает что-то о том, как ng-repeat derictive работает с контроллером, но не может найти решение в документации Angular JS.

  2. И второй вопрос - это хороший способ использования $ broadcast() для информирования администратора об изменениях в сервисе.

Update: Это attachedPropertyFactory код:

var AttachedPropertiesFactory = function() { 
     var propertiesArray = []; 
     var propertiesFactory = {}; 
     propertiesFactory.PutNewPropertiesInArray = PutNewPropertiesInArray; 
     propertiesFactory.GetPropertiesForEventById = GetPropertiesForEventById; 
     function GetPropertiesForEventById(eventId) { 
      selectedProperties = []; 
      for (var i = 0; i < propertiesArray.length; i++) { 
       if (propertiesArray[i].eventId === eventId) { 
        selectedProperties.push(propertiesArray[i]); 
       } 
      } 
      return selectedProperties; 
     } 

     function PutNewPropertiesInArray(properties) { 
      ClearPropertiesArray(); 
      for (var i = 0; i < properties.length; i++) { 
       propertiesArray.push(properties[i]); 
      } 
     }; 
     function ClearPropertiesArray() { 
      propertiesArray.length = 0; 
     } 

     return propertiesFactory; 
    }; 
AttachedPropertiesFactory.$inject = []; 
angular.module("svgObjectsApp").factory("eventPropertiesFactory", AttachedPropertiesFactory); 
+0

Вы также можете написать код eventPropertiesFactory. Может возникнуть проблема, или вы получите данные обратно в $ scope. attachedProperties? – V31

+1

Можете ли вы объявить $ scope.attachProperties как пустой массив, прежде чем делать $ scope. $ On call – Gabs00

+0

@ V31 Я поставил код eventPropertyFactory для обновления моего вопроса. – AndriyL

ответ

1

Я нашел решение этой проблемы. Я получил эту идею после прочтения следующей статьи: http://tutorials.jenkov.com/angularjs/watch-digest-apply.html.

Я добавил $ scope. $ Digest() в обработчике событий. Так что теперь мой код в FormController выглядит следующим образом:

var FormController = function ($scope, selectedObjectFactory, eventPropertiesFactory) { 
     $scope.$on("ObjectSelected", function (event, selectedObject) { 
      $scope.attachedProperties =  eventPropertiesFactory.GetPropertiesForEventById(selectedObject.selectedId);  
      $scope.$digest(); 
     }); 
} 

Это работает для меня, но я все еще не уверен, правильно ли это решение или нет.