Javascript 指令初始化和加载数据后调用函数
我对AngularJs中的指令有一个问题,因为我似乎不完全理解它们。Javascript 指令初始化和加载数据后调用函数,javascript,angularjs,Javascript,Angularjs,我对AngularJs中的指令有一个问题,因为我似乎不完全理解它们。 所以接下来的情况是: 1) 有一项指令: // directive function myDir() { var directive = { restrict: 'A', replace: false, transclude: false, templateUrl: '/js/shared/directives/myDir/myDir.html',
所以接下来的情况是:
1) 有一项指令:
// directive
function myDir() {
var directive = {
restrict: 'A',
replace: false,
transclude: false,
templateUrl: '/js/shared/directives/myDir/myDir.html',
controller: 'myDirController',
scope: {
myDir: '='
}
};
return directive;
}
// html
...
<div my-dir="vm.myDir"></div>
...
// controller
...
vm.id = $routeParams.id;
...
activate();
function activate() {
$q.when(loadData()).then(function() {
initSomething();
});
}
function loadData() {
if (!id) {
vm.model = {
data: []
};
return null;
} else {
// makes request to backend
myService.getData(id)
.then(function (data) {
vm.model = data;
}).catch(function (error) {
console.log(error);
}).finally(function() {
vm.model = vm.model || {
data: []
};
});
}
}
function initSomething() {
if (vm.myDir) {
vm.myDir.setSmthOptions(vm.smthOptions);
vm.whateverOptions.forEach(function (option) {
vm.myDir.addWhatever(option);
});
}
}
2) 此指令允许执行某些操作:
// directive controller
function myDirController($scope) {
var something = {};
var whatevers = [];
$scope.myDir = {
createSmth: createSmth,
setSmthOptions: setSmthOptions,
addWhatever: addWhatever,
removeWhatever: removeWhatever
};
function createSmth() {
something = {
someOption1: someDefaultValue1,
someOption2: someDefaultValue2,
someOption3: someDefaultValue3,
};
}
function setSmthOptions(options) {
angular.extend(something, options);
}
function addWhatever(options) {
var newWhatever = {
someOption1: someDefaultValue1,
someOption2: someDefaultValue2,
anotherOptions: options
};
whatevers.push(newWhatever);
}
function removeWhatever(whatever) {
var idx = whatevers.indexOf(whatever);
whatevers.splice(idx, 1);
}
}
3) 本指令的激活功能是:
activate()
function activate() {
createSomething();
}
有一个页面,我在这里使用这个指令:
// directive
function myDir() {
var directive = {
restrict: 'A',
replace: false,
transclude: false,
templateUrl: '/js/shared/directives/myDir/myDir.html',
controller: 'myDirController',
scope: {
myDir: '='
}
};
return directive;
}
// html
...
<div my-dir="vm.myDir"></div>
...
// controller
...
vm.id = $routeParams.id;
...
activate();
function activate() {
$q.when(loadData()).then(function() {
initSomething();
});
}
function loadData() {
if (!id) {
vm.model = {
data: []
};
return null;
} else {
// makes request to backend
myService.getData(id)
.then(function (data) {
vm.model = data;
}).catch(function (error) {
console.log(error);
}).finally(function() {
vm.model = vm.model || {
data: []
};
});
}
}
function initSomething() {
if (vm.myDir) {
vm.myDir.setSmthOptions(vm.smthOptions);
vm.whateverOptions.forEach(function (option) {
vm.myDir.addWhatever(option);
});
}
}
但我不确定使用它是否合适。也许有更好的解决办法
问题是:我应该如何解决这个问题?加载数据并初始化指令后如何调用函数?
$timeout
将在下一阶段触发摘要循环,如果您正在寻找与性能相关的函数,则可能可以使用$scope.$evalAsync()
。这是一篇关于这个问题的简洁的文章
您的服务调用是异步的。因此,当loadData函数完成并进行服务调用时,vm.model尚未初始化。您可以将代码更新为以下内容:
函数激活(){
loadData()。然后(函数(){
initSomething();
});
}
函数loadData(){
var deferred=$q.deferred();
如果(!id){
vm.model=vm.model | |{
数据:[]
};
返回$q.resolve();
}//向后端发出请求
否则{
myService.getData(id)
.then(功能(数据){
vm.model=数据;
}).catch(函数(错误){
console.log(错误);
}).最后(函数(){
vm.model=vm.model | |{
数据:[]
};
延迟。解决();
});
回报。承诺;
}
}
我听不懂你的回答。。如果您的建议是使用$q.defer()--$q.when()进行相同的操作(将同步和异步函数转换为异步),我知道这一点,并且正在使用它。但问题是关于另一个问题=\如我所说,我不想使用$timeout,对不起