【问题标题】:Ember Data hasMany async observed property "simple" issueEmber Data hasMany 异步观察到的属性“简单”问题
【发布时间】:2014-06-23 04:26:23
【问题描述】:

希望你能帮助我!

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

我还有一个不更新的标签上的计算属性。计算属性是一个简单的检查,看是否有任何标签(即不为空)。我尝试过各种各样的事情。我到了arrayComputed,然后停了下来。检查异步相关模型的计数是否高于 0 应该是相当简单的!我试过“tags.[]”、“tags.@each”、“tags.@each.status”、“tags.@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")
});

[编辑] 2014 年 5 月 7 日

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

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    我相信您正在寻找的是:

    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")
    });
    

    由于标签是一个数组,因此您希望在添加或删除标签时得到通知。发生这种情况时,'.@each' 将使其更新。

    【讨论】:

    • 感谢@bmeyers 的回答,但正如我在原始消息中所说的那样,我试过了,但没有成功。我非常了解 .@each,在我的(相当大的)应用程序中广泛使用了它。部分问题是加载数据的路由使用的是 Ember Data“过滤器”,当关联的集合被解决时,它似乎没有更新。不幸的是,这是过滤器的依赖项之一。
    • 说了我刚才所说的话,您的回答回答了 似乎 是我的问题,但是如果您阅读我自己对我的问题的回答,您就会发现问题所在。我会给你的答案打勾,然后用我的实际问题开始一个新问题。
    • 也许您应该在获取标签后尝试使用“then”。所以var tags = item.get("tags").then(function (tags) {code here});
    • 真的吗?在每个项目上?这是一个集合!来吧。
    • 不,这行不通,因为过滤器位于项目集合上...我了解如何承诺,然后工作得很好。如果您想多谈一点,请查看我的另一个问题。 (我在这个问题中链接了它)
    【解决方案2】:

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

    请注意,我什至不确定我是否“修复”了 Item 中的“hasTags”,它是否会触发下面的过滤引用来更新...?

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

    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;
        });
      }
    });
    

    【讨论】:

    • 这个“解决方案”实际上只是“有效”,因为返回一个承诺(带有 return tags.then(function() { return item.get("hasTags");}); 不是假的,所以它显示了“正确的”,顺便说一句。所以它根本不起作用。我想我觉得恶心。
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多