【问题标题】:Angular Components does not work with Promise and ServiceAngular 组件不适用于 Promise 和 Service
【发布时间】:2017-06-11 19:12:19
【问题描述】:

Angular 组件调用服务时遇到了一个非常奇怪的问题。 例如,我有一个简单的服务,里面有一些模型数据作为数组。我添加了两种方法,一种是同步的,一种是异步的,它返回一个承诺(如果我理解正确的话)。 现在有一个角度组件,它在示例应用程序中加载得很好。 在前端我有两个按钮,一个用于服务中的每种方法。 如果我现在按下按钮“btn1”,列表加载良好,一切正常。 如果我现在按下按钮“btn2”,我会在控制台中看到服务正确返回所有数据,但不会加载前端中的列表。

服务

var myItems = [
  {id: 1, name: "item1"},
  {id: 2, name: "item2"}
];

function ItemsService($q) { // inject the $q service
    this.$q = $q;
}

ItemsService.prototype = {
    loadItems: function () {
        return myItems;
    },

    loadItemsAsync: function () {
        var $qme = this.$q; // if i do not this, "this.$q" is undefined
        return this.$q.resolve(myItems);
    }
};

module.exports = {
    ItemsService: ItemsService
}

控制器

function Foo(ItemsService) {
    this.itemsService = ItemsService;
}

Foo.prototype = {
    loadItems: function () {
        this.items = this.itemsService.loadItems();
    },
    loadItemsAsync: function () {
        this.itemsService.loadItemsAsync().then(
            function (response) {
                this.items = response;
                console.log('data->' + this.items + ' -> ' + this.items[0].name);
            },
            function (error) {
                console.log('error->' + error); // ignore
            }
        );
    }
};

组件 HTML

<section>
    <button id="btn1" ng-click="$ctrl.loadItems()">Load</button>
    <button id="btn2" ng-click="$ctrl.loadItemsAsync()">Load Async</button>
    <ul>
        <li ng-repeat="item in $ctrl.items">{{item.id}} // {{item.name}}</li>
    </ul>
</section>

将来我想用服务调用替换“loadItemsAsync”服务方法中的代码,但实际上没有任何作用。

未来计划的服务方式代码

loadTreasuriesAsync: function () {
    var $qme = this.$q;
    return this.$http.get(this.url).then(
        function (response) {
            return $qme.resolve(response.data);
        },
        function (error) {
            throw error;
        }
    );
}

我也尝试过这个服务调用,但它也返回了一个 promise 对象。

loadItems: function () {
    return this.$http.get(this.url).then(function (response) {
        return response.data;
    });
},

谁能帮我找到解决办法?

【问题讨论】:

  • 你有 function (response) 但你希望 data 包含一些东西......并且$http 已经返回了一个承诺,所以使用 $q 是多余的。
  • 那是平等的。问题是,如果我使用同步调用,前端只会显示列表。
  • 顺便说一句,我会将标题重命名为“如何伪造 Promise 以及如何将 Promise 返回到组件控制器中。因为组件确实与服务和承诺一起工作。
  • 我不想伪造一个承诺,我只想在页面本身中看到我的数据,而不仅仅是在控制台中!

标签: angularjs angular-promise angular-components


【解决方案1】:

this.items = response;

这在上下文中不再存在。尝试通过外部变量(即 _this)或使用箭头函数(如果有可用的)来保存先前的上下文。

【讨论】:

  • 这是一个很好的提示,也是解决方案的一部分。与 FountainJS 相反,数据必须加载到 $scope 变量中,而不是加载到 this 中。这可以通过 ()={} 箭头函数来完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2021-05-19
  • 2022-01-05
  • 2020-04-19
  • 2018-08-23
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多