javascript - 带有 promise 的服务中的 Angular "this"符号和数据

标签 javascript angularjs

让我们切入正题。我有以下服务:

feedBackModule.factory("feedbackSkillService", function ($q, $filter, Query) {
    var skills = [];
    return {
        getSkills: function () {
            var d = $q.defer();
            if (skills.length <= 0) {
                Query.api2({
                    method: 'GET',
                    route: 'feedback/skill'
                }).then(function (result) {
                    skills = result;
                    d.resolve(result);
                });
            }
            else {
                d.resolve(skills);
            }
            return d.promise;
        },
        putSkill: function (skill) {
            skills.push(skill);
        },
        deleteSkill: function (skill) {
            var index = skills.indexOf(skill);
            Query.api2({
                method: 'DELETE',
                route: 'feedback/skill',
                params: {id: skill.id}
            });
            skills.splice(index, 1);
        },
        editSkill: function (skill) {
            Query.api2({
                method: 'PUT',
                route: 'feedback/skill',
                params: {id: skill.id},
                data: {skill: skill}
            });
        }
    }

});

以及以下 Controller :

    feedBackModule.controller('createCollectionController', ['Query', '$modalInstance', 'feedbackSkillService', 'feedbackCollectionService', function (Query, $modalInstance, feedbackSkillService, feedbackCollectionService) {
    this.collection = {};
    this.skills = [];

    feedbackSkillService.getSkills().then(function (result) {
        this.skills = result;
    });

    this.createSkill = function () {
        Query.api2({
            method: 'POST',
            route: 'feedback/skill',
            data: {skill: this.skill}
        }).then(function (result) {
            feedbackSkillService.putSkill(result);
        });
        $modalInstance.dismiss('cancel');
    };

    this.cancel = function () {
        $modalInstance.dismiss('cancel');
    };
}]);

如您所见,我正在尝试从 feedbackSkillService

获取技能

但是,由于一旦它返回 this.skill 就使用了 promise,这意味着我无法访问它并正确设置它。我知道您可以使用 $scope 执行此操作,但我不想使用 $scope

那么我怎样才能确保我可以访问变量呢?

最佳答案

feedbackSkillService.getSkills().then(function (result) {
    this.skills = result;
}.bind(this));
// ^^^^^^^^

您只需要确保回调中的 this 仍然引用您期望的 this;这里最简单的方法是绑定(bind)回调函数的上下文。

请注意,您可能仍然存在异步计时问题,并且在您调用 this.createSkill 时,result 可能还没有返回还没有。

关于javascript - 带有 promise 的服务中的 Angular "this"符号和数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35623422/

相关文章:

angularjs - ionic ng-cordova 振动插件不工作

javascript - Restangular:无法发布复杂的 json 参数?

javascript - 对表单输入使用可重用指令

javascript - jquery 中如何将焦点放在一个窗口上?

javascript - 使用 async/await 时如何获取完整的 Node.js 堆栈跟踪?

angularjs - react Angular Wordpress 多站点 WP-API - SEO?

javascript - AngularJS:错误:未知的提供商

javascript - 将 Node.js GET/POST 请求更改为 Ajax

javascript - 我如何修改这个 smarty 模板,以便它只对所有类别使用一个 <ul>?

javascript - document.querySelectorAll 与 div.style 一起不起作用