我有一个工厂函数,我想在三个不同的控制器中使用,如果要在控制器条件下使用工厂代码块,而在控制器的其他条件下要使用工厂代码块,我想使用。如何使用工厂的任何帮助来完成此任务将不胜感激。

到目前为止,下面尝试过的代码...

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();
                        }

                    };

最佳答案

好吧,我可能不在这里,但这是您要尝试的吗?

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);
  }
});

关于javascript - 如何将工厂函数用于不同的AngularJS Controller ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29801002/

10-16 09:17