1

Factory:Выполнение кода в заводе, когда это необходимо, а не при загрузке в контроллер

.factory("myFac", ['$http', '$q', function($http, $q) { 
    var defer = $q.defer(); 

    $http.get('some/sample/url').then(function (response) { //success 
     /* 
     * Do something with response that needs to be complete before 
     * controller code is executed. 
     */ 
     defer.resolve('done'); 
    }, function() { //error 
     defer.reject(); 
    }); 

    return defer.promise; 
}]); 

Контроллер:

.controller("testCtrl", ['$scope', 'myFac', function($scope, myFac) { 
    /* 
    * Factory code above is executed immediately as 'myFac' is loaded into controller. 
    * I do not want this. 
    */ 

    if($scope.someArbitraryBool === true) { 
     //THIS is when I want to execute code within myFac 
     myFac.then(function() { 
      //Execute code that is dependent on myFac resolving 
     }); 
    } 
}]); 

Пожалуйста, дайте мне знать, если это возможно, чтобы задержать код на заводе до Мне это нужно. Кроме того, если есть лучший способ выполнить эту концепцию, не стесняйтесь исправлять.

ответ

0

У вас есть $http.get непосредственно внутри фабричной функции, которая возвращает пользовательские обещания $ q. Поэтому, когда вы вводите фабричную зависимость внутри своей функции контроллера, она запрашивает угловое создание объекта фабричной функции myFac, создавая объект функции, он выполняет блок кода, который вы вернули на свой завод, в основном, который возвращает обещание.

Что вы можете сделать это, просто возвращает объект {} из функции фабрики, которая будет иметь название метода с его определением, поэтому, когда вы впрыснуть внутри углового контроллера он будет возвращать объект службы, который будет различный метод как getData метод. И всякий раз, когда вы хотите назвать метод завода, вы можете сделать factoryName.methodName(), как myFac.getData().

Также вы создали дополнительное обещание внутри вашей службы, которая не нужна в первую очередь, как вы можете использовать обещание $http.get (который возвращает объект посыла.)

завод

.factory("myFac", ['$http', function($http) { 
    var getData = return $http.get('some/sample/url').then(function (response) { //success 
     return 'done'; //return to resolve promise with data. 
    }, function(error) { //error 
     return 'error'; //return to reject promise with data. 
    }); 

    return { 
     getData: getData 
    }; 

}]); 

контроллер

.controller("testCtrl", ['$scope', 'myFac', function($scope, myFac) {  
    if($scope.someArbitraryBool === true) { 
     //Here you could call the get data method. 
     myFac.getData().then(function() { 
      //Execute code that is dependent on myFac resolving 
     }); 
    } 
}]); 
+0

@JLewkovich сделать upvote I f это помогло .. Спасибо :) –