Javascript 指令初始化和加载数据后调用函数

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',

我对AngularJs中的指令有一个问题,因为我似乎不完全理解它们。
所以接下来的情况是:
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,对不起