如何在加载视图时在控制器使用服务对象之前实例化服务中的某些对象
How to instantiate some objects in service before controller uses the service objects when its view is loaded
我有一个加载视图和设置控制器的 stateprovider。现在控制器依赖于应该提供更新对象的服务。例如,我有一个状态 - s,带有模板 v 和控制器 c。 c 依赖于服务 s。 s 有方法 - 让我们说 'sm' 从 AJAX 获取数据。现在我希望 'sm' 仅在加载状态时但在实例化控制器之前调用。
我知道这可以用 resolve 来完成,但是如何在实例化控制器之前订购服务方法的加载。
我正在使用基于 oclazylaod 的函数 'loadSequence' 以特定顺序加载脚本。
例如
.state('member.course', {
url: "/course",
templateUrl: "assets/views/course.html",
controller: 'coursecontroller',
resolve: loadSequence('someservice', 'coursecontroller', 'toaster', 'ngImgCrop'),
data: {
css: 'assets/css/course.css'
}
})
我希望在加载 'courseController' 之前调用 someservice.getData 方法。怎么做?
编辑-loadSequence;:-
function loadSequence() {
var _args = arguments;
return {
deps: ['$ocLazyLoad', '$q',
function($ocLL, $q) {
var promise = $q.when(1);
for (var i = 0, len = _args.length; i < len; i++) {
promise = promiseThen(_args[i]);
}
return promise;
function promiseThen(_arg) {
if (typeof _arg == 'function')
return promise.then(_arg);
else
return promise.then(function() {
var nowLoad = requiredData(_arg);
if (!nowLoad)
return $.error('Route resolve: Bad resource name [' + _arg + ']');
return $ocLL.load(nowLoad);
});
}
function requiredData(name) {
if (jsRequires.modules)
for (var m in jsRequires.modules)
if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
return jsRequires.modules[m];
return jsRequires.scripts && jsRequires.scripts[name];
}
}
]
};
}
我以前遇到过同样的情况,我是这样解决的..
.state('member.course', {
url: "/course",
templateUrl: "assets/views/course.html",
controller: 'coursecontroller',
resolve: {
b: ['someservice', function(someservice) {
return someservice.getData();//as its a ajax request it will return a promise
}],
a: ['b', function(b) {
return angular.element(document.body).injector().invoke(loadSequence('coursecontroller', 'toaster', 'ngImgCrop')['deps'])
}]
},
data: {
css: 'assets/css/course.css'
}
})
我有一个加载视图和设置控制器的 stateprovider。现在控制器依赖于应该提供更新对象的服务。例如,我有一个状态 - s,带有模板 v 和控制器 c。 c 依赖于服务 s。 s 有方法 - 让我们说 'sm' 从 AJAX 获取数据。现在我希望 'sm' 仅在加载状态时但在实例化控制器之前调用。
我知道这可以用 resolve 来完成,但是如何在实例化控制器之前订购服务方法的加载。
我正在使用基于 oclazylaod 的函数 'loadSequence' 以特定顺序加载脚本。
例如
.state('member.course', {
url: "/course",
templateUrl: "assets/views/course.html",
controller: 'coursecontroller',
resolve: loadSequence('someservice', 'coursecontroller', 'toaster', 'ngImgCrop'),
data: {
css: 'assets/css/course.css'
}
})
我希望在加载 'courseController' 之前调用 someservice.getData 方法。怎么做?
编辑-loadSequence;:-
function loadSequence() {
var _args = arguments;
return {
deps: ['$ocLazyLoad', '$q',
function($ocLL, $q) {
var promise = $q.when(1);
for (var i = 0, len = _args.length; i < len; i++) {
promise = promiseThen(_args[i]);
}
return promise;
function promiseThen(_arg) {
if (typeof _arg == 'function')
return promise.then(_arg);
else
return promise.then(function() {
var nowLoad = requiredData(_arg);
if (!nowLoad)
return $.error('Route resolve: Bad resource name [' + _arg + ']');
return $ocLL.load(nowLoad);
});
}
function requiredData(name) {
if (jsRequires.modules)
for (var m in jsRequires.modules)
if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
return jsRequires.modules[m];
return jsRequires.scripts && jsRequires.scripts[name];
}
}
]
};
}
我以前遇到过同样的情况,我是这样解决的..
.state('member.course', {
url: "/course",
templateUrl: "assets/views/course.html",
controller: 'coursecontroller',
resolve: {
b: ['someservice', function(someservice) {
return someservice.getData();//as its a ajax request it will return a promise
}],
a: ['b', function(b) {
return angular.element(document.body).injector().invoke(loadSequence('coursecontroller', 'toaster', 'ngImgCrop')['deps'])
}]
},
data: {
css: 'assets/css/course.css'
}
})