我有一个显示项目的控制器。 用户可以将项目放在他们的愿望清单中。 (项目有很多用户,用户有很多项目。)
因此,当用户进入网页时,我想基于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控制台时,它会正确返回长度。 我错过了这条路线的东西吗?如何解决问题?
答案 0 :(得分:0)
问题在于您是否同步使用代码,尽管它是异步属性。
第一次尝试使用异步关系时,它将开始解析关系,因此需要回调服务器。在您的情况下,您尝试立即使用这些用户,但是第一次它们将是空的,因此您包含的内容将返回false。因为你没有看到用户'然后它会更新,但计算属性不会更新,因为计算属性只是在观察item
。这就是为什么当你从控制台尝试它时,它可以工作,因为当你尝试在控制台中使用它时,它已经完成了对异步用户集的解析。
isAddedToList: function() {
var promiseUsers = this.get("item.users"), user = this.get("user");
return promiseUsers.contains(user);
}.property("user", 'item.users.[]')