Мне нужно использовать угловое обслуживание для создания каскадных выпадающих списков. Прокомментированный код, который я создал для тестирования, и он работает нормально. Мне нужно создать две службы для вызова двух методов с контроллера MVC: GetCompanies() и GetDocTypes() Мои вопросы: Является ли моя первая услуга правильной и как я могу позвонить сервисам с контроллера? Спасибо.
/// <reference path="angular.js" />
//var myApp = angular
// .module("myApp", [])
// .controller("companyController", function ($scope, $http) {
// $http.post('CurrentSettings/GetCompanies')
// .then(function (response) {
// var response = $.parseJSON(response.data);
// $scope.currentSettings = response;
// });
// });
var myApp = angular.module("myApp", []);
myApp.service('getCompanies', function () {
$http.post('CurrentSettings/GetCompanies')
.then(function (response) {
var response = $.parseJSON(response.data);
$scope.currentSettings = response;
});
});
myApp.controller("companyController", function ($scope, getCompanies, $http) {
});
Проблема с вашим сервисом в два раза:
Во-первых, нет способа вызвать услугу. Вы ввели это хорошо, но что теперь? Подумайте о своей службе как API; это не хорошо, просто имея ссылку на него где-то, вы должны иметь возможность использовать его. Я бы изменил следующее:
var myApp = angular.module("myApp", []);
myApp.service('getCompanies', ["$http", function($http) {
this.currentSettings = "Hello";
$http.post('CurrentSettings/GetCompanies')
.then(function(response) {
var response = $.parseJSON(response.data);
this.currentSettings = response;
});
}]);
myApp.controller("companyController", ["$scope", "getCompanies",
function($scope, getCompanies) {
$scope.currentSettings = getCompanies.currentSettings;
}]);
Обратите внимание на несколько вещей:
Вторая проблема - время. Обратите внимание, что я использовал супер-оригинальное значение "Hello" для инициализации поля службы.
Значение, которое вы получаете от службы, зависит от того, считывает ли контроллер значение после вызова контроллера MVC.
Чтобы исправить это, служба может выставить второе поле, чтобы указать, что список компаний полностью загружен, но это действительно смещает проблему, а не исправляет ее.
Вам нужна функция, которая возвращает обещание. Если значение уже загружено, обещание немедленно устраняется. Если нет, он возвращает обещание, которое вернется после завершения вызова $ http.
Вот модифицированный код:
var myApp = angular.module("myApp", []);
myApp.service('companiesService', ['$http', '$q', function($http, $q) {
var currentSettings = null;
this.getList = function() {
var def = $q.defer()
if (currentSettings) {
def.resolve(currentSettings);
} else {
$http.get('CurrentSettings/GetCompanies')
.then(function(response) {
var response = response.data;
currentSettings = response;
def.resolve(currentSettings);
});
}
return def.promise;
}
}]);
myApp.controller('companyController', ['$scope', 'companiesService',
function($scope, companiesService) {
$scope.currentSettings = '';
companiesService.getList().then(function(value) {
$scope.currentSettings = value;
});
}
]);
Это становится немного сложнее, потому что вы должны использовать обещания, но это то, что нужно отметить: