首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指令初始化和加载数据后调用函数

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

Stack Overflow用户
提问于 2016-04-07 13:16:15
回答 2查看 823关注 0票数 0

我对AngularJs中的指令有一个疑问,因为我似乎不完全理解它们。

接下来的情况是:

1)有一项指令:

代码语言:javascript
复制
// directive
function myDir() {
    var directive = {
        restrict: 'A',
        replace: false,
        transclude: false,
        templateUrl: '/js/shared/directives/myDir/myDir.html',
        controller: 'myDirController',
        scope: {
            myDir: '='
        }
    };
    return directive;
}

2)该指令允许执行以下一些操作:

代码语言:javascript
复制
// 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)该指令的激活功能是:

代码语言:javascript
复制
activate()
function activate() {
    createSomething();
}

有一页,我用这个指令:

代码语言:javascript
复制
// 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);
        });
    }
}

问题是,指令可以在获得数据后初始化,因为在id =未定义的情况下,我们创建了默认模型。对不起,我不想使用$timeout,因为我认为它看起来很难看。

现在我使用的是下一个解决方案:

代码语言:javascript
复制
var watcher = $scope.$watch(
    function () {
        return {
            model: $scope.vm.model,
            myDir: $scope.vm.myDir
        };
    },
    function (newObj) {
        if (newObj.model && newObj.myDir) {
            initSomething();
            watcher();
        }
    },
    true
);

但我不确定是否可以使用它。也许有更好的解决办法。

和问题是:我应该如何解决这个问题?如何在加载数据和初始化指令之后调用函数?

EN

回答 2

Stack Overflow用户

发布于 2016-04-07 13:24:24

$timeout将在下一阶段触发摘要周期,如果您正在寻找与性能相关的功能,则可以使用$scope.$evalAsync()。这是一篇关于这个主题的简洁的文章。

http://www.bennadel.com/blog/2605-scope-evalasync-vs-timeout-in-angularjs.htm

票数 0
EN

Stack Overflow用户

发布于 2016-04-07 13:52:41

您的服务调用是异步的。因此,当loadData函数完成并进行服务调用时,vm.model尚未初始化。您可以将代码更新为如下内容:

代码语言:javascript
复制
function activate() {
    loadData().then(function() {
        initSomething();
    });
}

function loadData() {
    var deferred = $q.defer();
    if (!id) {
        vm.model = vm.model || {
            data: []
        };
        return $q.resolve();
    } // makes request to backend
    else {
        myService.getData(id)
            .then(function(data) {
                vm.model = data;
            }).catch(function(error) {
                console.log(error);
            }).finally(function() {
                vm.model = vm.model || {
                    data: []
                };
                deferred.resolve();
            });
        return deferred.promise;
    }

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36477384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档