Ember Data有许多异步观察到的属性"简单"问题

时间:2014-05-06 13:54:02

标签: javascript ember.js ember-data

希望你能帮助我!

我的Ember应用程序(Ember 1.5.1)有两个型号(Ember Data beta7):项目和标签。物品有很多标签。

我还在标签上有一个不会更新的计算属性。计算属性是一个简单的检查,以查看是否有任何标记(即非空)。我尝试过各种各样的事情。我得到了arrayComputed,然后停了下来。检查异步相关模型的计数是否大于0应该是相当简单的!我已尝试过#34;标签。[]","标签。@ each","标签。@ each.status","标签。@ each.isLoaded"," tags.length"和其他各种事情。

belongsTo上的计算属性工作正常。

App.Item = DS.Model.extend({
  tags: DS.hasMany("tag", inverse: "item", async: true),
  hasTags: function() {
    return !Em.isEmpty(this.get("tags"));
  }.property("tags")
});

App.Tag = DS.Model.extend(
  item: DS.belongsTo("item", inverse: "tags"),
  hasItem: function() {
    return !Em.isEmpty(this.get('))
  }.property("item")
);

如果我把它改成这样读,那么日志会在其中打印一行,所以承诺实际上是在履行和加载。我只是不知道在计算属性上放什么,以便在履行承诺时重新加载。我觉得我错过了一些非常明显的东西:

App.Item = DS.Model.extend({
  tags: DS.hasMany("tag", inverse: "item", async: true),
  hasTags: function() {
    this.get("tags").then(function(tags) {
      console.log("The tags are loding if this is printed");
    });
    return !Em.isEmpty(this.get("tags"));
  }.property("tags")
});

[edit] 2014年5月7日

好吧所以我没有完全正确地解释这个问题,我猜是因为我没有完全理解错误的原因......我在下面的堆栈溢出中继续问题问题:Route's Model Hook with Ember Data "filter" not loading dependent computed property

2 个答案:

答案 0 :(得分:0)

好的,希望有人能得到比这更好的答案,但这就是我如何得到它的方式"现在,在我的路线中(我觉得这是一种绝对荒谬的方式),通过调整依赖于" hasTags"而不是调整hasTags本身。

注意我甚至不确定我是否已经修好了#34; " hasTags" in Item是否会触发下面的过滤参考更新......?

我想也许我们需要过滤器在其块中具有承诺感知(即,您可以使用属性来过滤承诺,并且它会做正确的事情):

App.TaggedItemsListRoute = App.ItemsRoute.extend({
  model: function() {
    var store = this.get("store");
    var storePromise = store.find("item", { has_tags: true });
    var filtered = store.filter("item", function(item) {
      var tags = item.get("tags");
      if tags.get("isFulfilled") {
        return item.get("hasTags");
      } else {
        return tags.then(function() {
          return item.get("hasTags");
        });
      }
    });
    return storePromise.then(function(response) {
      return filtered;
    });
  }
});

答案 1 :(得分:0)

我相信你要找的是:

App.Item = DS.Model.extend({
  tags: DS.hasMany("tag", inverse: "item", async: true),
  hasTags: function() {
    this.get("tags").then(function(tags) {
      console.log("The tags are loding if this is printed");
    });
    return !Em.isEmpty(this.get("tags"));
  }.property("tags.@each")
});

由于tags是一个数组,因此您希望在添加或删除标记时收到通知。当发生这种情况时,'。@ each'会更新。