Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 路线';带有余烬数据的s模型挂钩;“过滤器”;未加载依赖的计算属性_Javascript_Ember.js_Ember Data - Fatal编程技术网

Javascript 路线';带有余烬数据的s模型挂钩;“过滤器”;未加载依赖的计算属性

Javascript 路线';带有余烬数据的s模型挂钩;“过滤器”;未加载依赖的计算属性,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,希望你能帮助我!:) 我的问题是,我有一个这样的路线,我希望填充一个项目列表。。。i、 e.“请只带标签的”,但它不: App.TaggedItemsListRoute = App.ItemsRoute.extend({ model: function() { var store = this.get("store"); var storePromise = store.find("item", { has_tags: true }); var filtered =

希望你能帮助我!:)

我的问题是,我有一个这样的路线,我希望填充一个项目列表。。。i、 e.“请只带标签的”,但它不:

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) {
      return item.get("hasTags");
    });
    return storePromise.then(function(response) {
      return filtered;
    });
  }
});
现在。。。这种简单的方法不起作用,因为“hasTags”返回false,因为它依赖于“tags”,后者返回一个ManyArray,该数组暂时为空,因为它尚未解析(请参见下面的模型)。我觉得这很糟糕。它说的是“嘿,我一个都没有!”但我希望它说的是“请稍后重新计算我”,过滤器正在寻找布尔值,但我想传递的是“嘿,在所有hastag都解析之前不要解析过滤器”,或者至少要重新计算它通过的ManyArray

如果我只是传回一个承诺作为过滤器的返回值,那么它就可以工作了

returnitem.get(“tags”).then(函数(tags){returnitem.get(“hasTags”);})

除此之外,它实际上不是,因为过滤器得到一个承诺,但它显然不知道承诺,所以当它寻找一个布尔值时,它得到一个承诺,它的计算结果为true,然后它几乎显示了列表中的所有项。这不是一个问题,直到我去一个不同的路线的项目,有,说,所有的项目上,然后回来。。。砰,里面有所有的东西。。。嗯

以下是我如何暂时“绕过”它。。。它仍然是马车,但我能忍受

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;
    });
  }
});
我认为在这个阶段,唯一能真正解决这个问题的方法就是使用RSVP。。。有什么想法吗

实际上,有一件事我还没有尝试过,我现在可能会尝试使用setupController进行过滤。唯一的问题是,所有项目都会被加载到列表中,然后在大约1秒后视觉上“跳回”到过滤状态。痛苦

型号

我的余烬应用程序(余烬1.5.1)有两个模型(余烬数据beta7):项目和标签。物品有很多标签

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

这是一个衍生问题,因为我没有很好地解释我的问题,实际上问错了问题。我原本以为可以修改模型“hasTags”属性,使其在路由上下文中正确运行,但现在我认为这不会正常工作…

这似乎是
RSVP的一个非常好的候选者。顺便说一句,如果你想了解RSVP的详细情况,我在几周前做了一个关于它的演讲(不要太在意它,比萨饼做了一半,我饿了,)。无论如何,您的过滤器显然取决于在执行之前解析的标记集合。因此,在执行过滤器之前,最好先等待这些问题得到解决

App.TaggedItemsListRoute = App.ItemsRoute.extend({
  model: function() {
    var store = this.get("store");
    return store.find("item", { has_tags: true }).then(function(items){
         var tagPromises = items.getEach('tags');
         return Ember.RSVP.all(tagPromises).then(function(tagCollections){
             // at this point all tags have been received
             // build your filter, and resolve that
             return store.filter("item", function(item) {
                return item.get("hasTags");
             });
         });
    });
  }
});
使用颜色的类似想法的示例(我仅在关系有3种关联颜色时显示)

另一方面,如果你想让这个钩子立即解析,然后神奇地填充,你可以欺骗并返回一个数组,然后在服务器返回结果后填充数组,让你的应用程序看起来反应非常快(通过在页面上画一些东西,然后神奇地填写结果)

快速结果示例,立即返回(仅当关系有3种关联颜色时才显示)

谢谢kingpin2k。我爱你:)顺便问一句,这个完全有效的解决方案到底能让你吸多少屁股?我们必须这样编写代码,这是最大的一堆失败。Javascript就是这样一袋狗屎此外,我还尝试使用模型挂钩的阻塞UI(我的应用程序中有一个“等待数据”模板,所以我并不特别想要“quickResults”)。知道就够了“是的,使用RSVP.all。我知道如何使用它,所以我会去使用它:)我会看你的视频tho:)谢谢!一旦我实施了它并成功了,我会把它作为正确答案打勾。:)谢谢您的帮助,顺便说一句,您可能会使用非异步标记,因为您必须等待它们全部提取,只需少一个请求。我发现在类似的情况下,我定义了一个自定义标记长度属性,该属性代理data.tags.length,以避免请求所有标记。我认为问题/情况的根源是。是的,这是使用异步关系的已知限制。长度和id不一定需要回调到服务器,但遗憾的是,当前的实现在接触记录的引用时延迟加载记录。目前,大多数人都是通过使用通常不推荐的内部属性进行黑客攻击。
App.TaggedItemsListRoute = App.ItemsRoute.extend({
  model: function() {
    var store = this.get("store"),
        quickResults = [];
    store.find("item", { has_tags: true }).then(function(items){
         var tagPromises = items.getEach('tags');
         return Ember.RSVP.all(tagPromises).then(function(tagCollections){
             // at this point all tags have been received
             // build your filter, and resolve that
             return store.filter("item", function(item) {
                return item.get("hasTags");
             });
         });
    }).then(function(filterResults){
       filterResults.forEach(function(item){
         quickResults.pushObject(item);
       });
    });

    return quickResults;
  }
});