Emberjs promiseArray内部路线无法正常返回

时间:2014-05-10 16:04:37

标签: ember.js

我有一个显示项目的控制器。 用户可以将项目放在他们的愿望清单中。 (项目有很多用户,用户有很多项目。)

因此,当用户进入网页时,我想基于isAddedToList属性向用户显示AddToList或RemoveFromList按钮。

以下是代码。

用户模型:

var User = DS.Model.extend({
  username: DS.attr('string'),
  email: DS.attr('string'),
  avatar: DS.attr('string'),
  items: DS.hasMany("item", { async: true })
});

export default User;

ItemModel:

var Item = DS.Model.extend({
    name: DS.attr("string"),
    priceInCent: DS.attr("number"),
    salePriceInCent: DS.attr("number"),
    brand: DS.belongsTo("brand"),
    itemImages: DS.hasMany("itemImage", { async: true }),
    users: DS.hasMany("user", { async: true }),
});

export default Item;

ItemRoute:

var ItemRoute = Ember.Route.extend({
  model: function(params) {
    var userId = this.get("session").get("userId");
    return Ember.RSVP.hash({
      item: this.store.find('item', params.item_id),
      user: this.store.find('user', userId),
    });
  },
  setupController: function(controller, model) {
    controller.set('item', model.item);
    controller.set('user', model.user);
  }
});

export default ItemRoute;

ItemController:

var ItemController = Ember.Controller.extend({
  needs: ["current-user", "application"],
  currentUser: Ember.computed.alias("controllers.current-user"),
  isAddedToList: function() {
    var promiseUsers = this.get("item.users"), user = this.get("user");
    return promiseUsers.contains(user);
  }.property("item"),
  actions: {
    addToList: function() {
      var item = this.get("item"), user = this.get("user");
      item.get("users").pushObject(user);
      item.set("addedUserIds", [user.get("id")]);
      item.save();
    },
    removeFromList: function() {
      var item = this.get("item"), user = this.get("user");
      item.get("users").removeObject(user);
      item.set("removedUserIds", [user.get("id")]);
      item.save();
    }
  }
});

export default ItemController;

问题是当我用

检查promiseUsers的长度时
promiseUsers.get("length")

它总是返回0.

但是当我尝试使用Chrome控制台时,它会正确返回长度。 我错过了这条路线的东西吗?如何解决问题?

1 个答案:

答案 0 :(得分:0)

问题在于您是否同步使用代码,尽管它是异步属性。

第一次尝试使用异步关系时,它将开始解析关系,因此需要回调服务器。在您的情况下,您尝试立即使用这些用户,但是第一次它们将是空的,因此您包含的内容将返回false。因为你没有看到用户'然后它会更新,但计算属性不会更新,因为计算属性只是在观察item。这就是为什么当你从控制台尝试它时,它可以工作,因为当你尝试在控制台中使用它时,它已经完成了对异步用户集的解析。

isAddedToList: function() {
  var promiseUsers = this.get("item.users"), user = this.get("user");
  return promiseUsers.contains(user);
}.property("user", 'item.users.[]')