我试图在我的UI-Router router.js文件中懒惰加载控制器和模板,但是我对模板有困难.
控制器正确加载,但在加载之后,我们必须加载模板,这就是出错的地方.
在ocLazyLoad加载控制器之后,我们解析了一个Angular promise,它也包含在templateProvider中.问题是在文件加载完成后返回promise(templateDeferred.promise),而promise作为对象返回.
.state('log_in', {
url: '/log-in',
controller: 'controllerJsFile',
templateProvider: function($q, $http) {
var templateDeferred = $q.defer();
lazyDeferred.promise.then(function(templateUrl) {
$http.get(templateUrl)
.success(function(data, status, headers, config) {
templateDeferred.resolve(data);
}).
error(function(data, status, headers, config) {
templateDeferred.resolve(data);
});
});
return templateDeferred.promise;
},
resolve: {
load: function($templateCache, $ocLazyLoad, $q) {
lazyDeferred = $q.defer();
var lazyLoader = $ocLazyLoad.load ({
files: ['src/controllerJsFile']
}).then(function() {
return lazyDeferred.resolve('src/htmlTemplateFile');
});
return lazyLoader;
}
},
data: {
public: true
}
})
Run Code Online (Sandbox Code Playgroud) 这是我的app.js文件 - 我有一个父状态和两个子状态.两个子视图都需要该对象.
states.push({
name: 'parentstate',
url: '/parent/:objId',
abstract: true,
templateUrl: 'views/parentview.html',
controller: function() {},
resolve: {
obj: function(OBJ, $stateParams) {
return OBJ.get($stateParams.objId);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我想用这个解决的obj来决定子模板
states.push({
name: 'parentstate.childs',
url: '/edit',
views: {
"view1@parentstate": {
templateUrl: 'views/view1',
controller: 'view1Ctrl'
},
"view2@parentstate": {
templateUrl: function(obj) {
if (obj.something == something) {
return "views/view2first.html";
} else {
return 'views/view2second.html';
}
},
controller: 'view2Ctrl'
}
}
});
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这一目标?
我想根据我在angularjs bootstrap中定义的预设常量来更改与控制器关联的templateUrl.我无法弄清楚如何改变它.我已经尝试过UrlRouteProvider但是还没弄清楚如何从文件系统中拉出html.我被困在templateUrl上.
在下面的代码中,输出首先显示"svcc确实传递到第一个函数的console.out但是在templateUrl定义函数中,CONFIG是未定义的.
我愿意采取其他方式来做到这一点.
var app = angular.module('svccApp', [
'ui.router'
]);
var myConstant = {};
myConstant.codeCampType = "svcc";
app.constant("CONFIG", myConstant);
app.config(['$stateProvider', '$urlRouterProvider','CONFIG',
function ($stateProvider, $urlRouterProvider,CONFIG) {
console.log(CONFIG.codeCampType);
$stateProvider
.state('home', {
url: '/home',
//templateUrl: 'index5templateA.html', (THIS WORKS)
templateUrl: function(CONFIG) {
console.log('in templateUrl ' + CONFIG.codeCampType);
if (CONFIG.codeCampType === "svcc") {
return 'index5templateA.html';
} else {
return 'index5templateB.html';
}
},
controller: function ($state) {
}
});
}]);
Run Code Online (Sandbox Code Playgroud) 我正在尝试让AngularJS的UI-Router选择已定义的状态(即"project"),如果没有匹配,则默认为"root"状态."root"状态应检查远程API(Firebase)并根据结果加载相应的视图.
以下示例未完成以下任一要求:
1)" http://website.com/project "与"root"状态匹配,而不是(先前定义的)"project"状态.
2)"fbutil"未在"templateUrl"函数中定义,并且无法注入.
请帮我解决这些问题.
angular.module('app')
.config(['$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('project', {
url: '/project',
views: {
'mainView': {
controller: 'ProjectCtrl as project',
templateUrl: '/views/project.html'
}
}
})
.state('root', {
url: '/:id',
views: {
'mainView': {
templateUrl: function($stateParams, fbutil) {
var ref = fbutil.ref('user_data', id);
ref.once('value', function(dataSnapshot) {
return '/views/' + dataSnapshot.$val() +'.html';
}, function(error) {
return '/views/root.html';
});
}
}
}
})
}
]);
Run Code Online (Sandbox Code Playgroud) 我知道这可能会得到一个答案,但是对于延迟加载实现本身来说更多.
所以,这是一个典型的UI-Router配置块:
app.config(function($stateProvider, $urlRouterProvider, $injector) {
$stateProvider
.state('home', {
url: '/home',
templateUrl: 'view_home.html', // Actually SHOULD BE result of a XHR request ....
controller: 'HomeCtrl'
});
});
Run Code Online (Sandbox Code Playgroud)
但是,如果我想在templateUrl请求($stageChangeStart)时加载它,那将是基于AJAX请求的.
应该如何实施?LARGE角应用程序如何处理这个问题?