2015-04-22 4 views
1

У меня есть заводская функция, которую я хочу использовать в трех разных контроллерах, я хочу использовать, если код фабричного кода внутри, если условие контроллера и еще блок кода фабрики я хочу использовать в другом состоянии контроллера. Как достичь этой задачи с использованием фабрики любая помощь будет оценена.Как я могу использовать заводскую функцию для разных контроллеров AngularJS?

До сих пор пытались ниже код ...

Factory.js

 angular.module("App").factory('geoTreeFactory', function() { 
      return { 
    getTreeCheck: function (geoLocation) { 
     if (geoLocation.id === 5657){ 
     $.each(geoLocation.parent(),function(index,location) { 
      if (location.id !== geoLocation.id) { 
      $.each(location._childrenOptions.data.items,function(index,child){ 
       var disableChildId = 'disabled' + child.id; 
       var model = $parse(disableChildId); 
       model.assign($scope, true); 
      }) 
      var disableItemId = 'disabled' + location.id; 
      var model = $parse(disableItemId); 
      model.assign($scope, true); 
      } 
     }); 
     } 
     // If a child is checked Disable the parents 
     try { 
      var parent = geoLocation.parent().parent(); 
      var disableParentId = 'disabled' + parent.id; 
      var parentModel = $parse(disableParentId); 
      parentModel.assign($scope, true); 
     } catch (err) { 
    // Ignore since this happens when a node is selected which has no children 
     } 
    //Expand and collapse tree on parent check so childrens can be disabled. 
     $scope.riskInPrcsgeoLocationTree.expand($scope.riskInPrcsgeoLocationTree.findByText(geoLocation.text)); 
     $scope.riskInPrcsgeoLocationTree.collapse($scope.riskInPrcsgeoLocationTree.findByText(geoLocation.text)); 
     //If the parent item is checked, disable all the children 
     if(geoLocation.items) { 
      $.each(geoLocation.items,function(index,location) { 
      var disableItemId = 'disabled' + location.id; 
      var model = $parse(disableItemId); 
      model.assign($scope, true); 
      }); 
     } 
     }, 

     //Else block function if ocnditions are false 
     getTreeUncheck: function(geoLocation) { 
     if (geoLocation.id === 5657){ 
      var getParent = geoLocation.parent(); 
      $.each(geoLocation.parent(),function(index,location) { 
      if (location.id !== geoLocation.id) { 
       $.each(location._childrenOptions.data.items,function(index,child){ 
       var disableChildId = 'disabled' + child.id; 
       var model = $parse(disableChildId); 
        model.assign($scope, false); 
       }) 
       var disableItemId = 'disabled' + location.id; 
       var model = $parse(disableItemId); 
       model.assign($scope, false); 
      } 
      }); 
     } 
     // If child is unchecked Enable the parent 
     try { 
      var parent = geoLocation.parent().parent(); 
      var checkedChildrens = []; 
      for (var i=0; i<selectedRiskGeoLocations.length; i++){ 
      var checkNodes = selectedRiskGeoLocations[i]; 
      checkedChildrens.push(checkNodes); 
      } 
      if (checkedChildrens.length === 0){ 
      var disableParentId = 'disabled' + parent.id; 
      var parentModel = $parse(disableParentId); 
      parentModel.assign($scope, false); 
      }; 
     } 
     catch (err) { 
      // Ignore since this happens when a node is selected which has no children 
     } 
     //If the parent item is unchecked, enable the childrens 
     if(geoLocation.items){ 
      $.each(geoLocation.items,function(index,location){ 
       var disableItemId = 'disabled' + location.id; 
       var model = $parse(disableItemId); 
       model.assign($scope, false); 
      }); 
     } 
     } 
}; 

Controller.js

var selectedCtlGeoLocations = []; 
        var selectedCtlGeoLocationIds = []; 
        $scope.populateControlInPrcsGeoLoction = function(geoLocation) { 
         var pos = $.inArray(geoLocation.text,selectedCtlGeoLocations); 
         if (pos < 0) { 
          selectedCtlGeoLocations.push(geoLocation.text); 
          selectedCtlGeoLocationIds.push(geoLocation.id); 

          // If the parent item is checked, disable all the 
          // children 
         geoTreeFactory.getTreeIfBlock(); 

         } else { 
          selectedCtlGeoLocations.splice(pos, 1); 
          selectedCtlGeoLocationIds.splice($.inArray(
            geoLocation.id, selectedCtlGeoLocationIds), 
            1); 

          // If the parent item is unchecked, enable the 
          // children 
          geoTreeFactory.getTreeElseBlock(); 
         } 

        }; 
+4

Вы можете разместить наименьшее количество кода, необходимого для демонстрации вопрос? Там много логики, которая загромождает ваш вопрос, и я не понимаю, о чем вы спрашиваете. – Tom

+0

уменьшенное количество кода ... – aftab

+1

Итак, в вашем контроллере, если вы нажмете блок 'if', вы хотите нажать оператор' if' в службе, и если вы нажмете блок 'else' в вашем контроллере, ударить 'else' в вашу службу? Нет, нет никакого способа сделать это, не удовлетворяя условию 'else'. Но, если вы знаете, что это так, почему бы не использовать две совершенно разные функции и назвать их прямо с вашего контроллера. – Tom

ответ

1

Хорошо, я мог бы быть далеко отсюда, но это то, что вы пытаешься это сделать?

app.factory('myservice', function(){ 
    return { 
    ifBlock: function(){ 
     // code to run if condition is true 
    }, 
    elseBlock: function(){ 
     // code to run if condition is false 
    } 
    } 
}); 

app.controller('main', function(myservice){ 
    $scope.myevent = function(geoLocation){ 
    if(condition){ 
     myservice.ifBlock(geoLocation); 
    } else { 
     myservice.elseBlock(geoLocation); 
    } 
    } 
}); 

Вы также можете решить эту проблему, как это (и если я понимаю вашу проблему правильно, это, вероятно, предпочтительный метод):

app.service('myservice', function(){ 
    return { 
    go: function(geoLocation){ 
     if(condition){ 
     // code to run if condition is true 
     } else { 
     // code to run if condition is false 
     } 
    } 
    } 
}); 

app.controller('main', function(myservice){ 
    $scope.myevent = function(geoLocation){ 
    myservice.go(goeLocation); 
    } 
}); 
+0

Спасибо, что использовал ваш подход, я смог вызвать заводские условия в контроллере, но я получаю geoLocation не определено. Мне нужно передать этот параметр на заводе. – aftab

+0

Я добавил новый код в вопрос, пожалуйста, посмотрите. я по достоинству оценю вашу помощь. – aftab

+0

Да, похоже, что geoLocation поступает с вашего контроллера, поэтому вам нужно передать это в функции ifBlock и elseBlock. Кроме того, вы можете выбрать более значимые имена для этих функций. – Trevor