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
Ruby on rails 使用Ember.js创建记录&;余烬数据及;轨道和记录处理清单_Ruby On Rails_Ember.js_Ember Data - Fatal编程技术网

Ruby on rails 使用Ember.js创建记录&;余烬数据及;轨道和记录处理清单

Ruby on rails 使用Ember.js创建记录&;余烬数据及;轨道和记录处理清单,ruby-on-rails,ember.js,ember-data,Ruby On Rails,Ember.js,Ember Data,我正在构建一个应用程序,其布局如下 我想创建一个新帖子,所以我按下了“新建帖子”按钮,它把我带到了“帖子/新建”路线 我的PostsNewRoute如下所示(我遵循所描述的方法) 它会立即创建新记录,更新帖子列表,并显示新帖子的表单 (来源:) 现在我有两个问题。 一是帖子列表的顺序。 我原以为这篇新文章会在榜首,但它却在榜首 我使用rails作为后端,并将Post模型顺序设置为 default_scope order('created_at DESC') 所以旧的帖子在现有帖子的下面。

我正在构建一个应用程序,其布局如下

我想创建一个新帖子,所以我按下了“新建帖子”按钮,它把我带到了“帖子/新建”路线

我的PostsNewRoute如下所示(我遵循所描述的方法)

它会立即创建新记录,更新帖子列表,并显示新帖子的表单


(来源:)

现在我有两个问题。

一是帖子列表的顺序。

我原以为这篇新文章会在榜首,但它却在榜首

我使用rails作为后端,并将Post模型顺序设置为

 default_scope order('created_at DESC')
所以旧的帖子在现有帖子的下面。但新创建的一个不是。(尚未提交到后端)

另一个是当我在列表中单击created post时

我可以在帖子列表中单击我新创建的帖子。它把我带到了一个带有URL的帖子页面

 /posts/null
这是我必须防止的非常奇怪的行为

我认为有两种解决办法

  • 当我点击“新建帖子按钮”时,创建一条记录并立即提交给服务器,当服务器成功保存我的新记录时,刷新帖子列表并进入新建帖子的编辑模式

  • 或者,当我在PostsNewView中单击“提交”按钮时,最初将路由的模型设置为null并创建一条记录

  • 或者只显示属性为

        'isNew' = false, 'isDirty' = false, 
    
  • 在名单上

    但遗憾的是,我不知道从哪里开始

    对于解决方案1,我完全迷路了

    对于解决方案2,我不知道如何用尚未存在的模型绑定输入表单中的数据

    对于解决方案3,我完全迷路了

    请帮帮我!余烬打算采用哪种方式

    (我听说Ember打算为每个开发者使用相同的解决方案)

    更新

    现在我正在使用解决方案3,但仍然存在订购问题。这是我的帖子模板代码

        <div class="tools">
            {{#linkTo posts.new }}new post button{{/linkTo}}
        </div>
        <ul class="post-list">
            {{#each post in filteredContent}}
            <li>
                {{#linkTo post post }}
                    <h3>{{ post.title }}</h3>
                    <p class="date">2013/01/13</p>
                    <div class="arrow"></div>
                {{/linkTo}}
            </li>
            {{/each}}
        </ul>
        {{outlet}}
    

    我们在应用程序的几个地方使用了解决方案3的变体。我认为这是3款中最干净的一款,因为您不必担心服务器端的安装/拆卸。我们就是这样实现的:

    App.PostsController = Ember.ArrayController.extend({
      sortProperties: ['id'],
      sortAscending: true,
      filteredContent: (function() {
        return this.get('content').filter(function(item, index) {
          return !(item.get('isDirty'));
        });
      }).property('content.@each')
    });
    
    然后,在帖子模板中循环使用controller.filteredContent,而不是controller.content

    对于解决方案1,有许多可能性。您可以定义以下事件:

      createPost: function() {
        var post,
          _this = this;
        post = App.Post.createRecord({});
        post.one('didCreate', function() {
          return Ember.run.next(_this, function() {
            return this.transitionTo("posts.edit", post);
          });
        });
        return post.get("store").commit();
      }
    

    它创建post,然后设置一个承诺,一旦“didCreate”在post上触发,该承诺将被执行。这个承诺只有在帖子从服务器返回后才会转换到帖子的路由,因此它将具有正确的ID。

    的确,写得很好。谢谢

    您的
    filteredContent
    是否必须使用
    isNew
    状态i.o.
    isDirty
    ,否则正在编辑的帖子将不可见。 在这两种情况下,
    filteredContent
    属性在我的情况下都不起作用。我还注意到,由于我使用图像作为每个元素的一部分,因此当
    filteredContent
    更改时,所有图像都将刷新。这意味着我看到对每个图像的请求

    我使用的方法略有不同。我循环浏览内容并决定是否在模板中显示帖子

    # posts.handlebars
    <ul class='posts'>
      {{#each controller}}
        {{#unless isNew}}
          <li>
            <h3>{{#linkTo post this}}{{title}}{{/linkTo}}</h3>
            <img {{bindAttr src="imageUrl"}}/>
            <a {{action deletePost}} class="delete-post tiny button">Delete</a>
          </li>
        {{/unless}}
      {{/each}}
    </ul>
    
    您可以这样做:

    # App.Post
    App.Post = DS.Model.extend({
      title: DS.attr('string', {
        defaultValue: "default placeholder title"
      }),
      body: DS.attr('string', {
        defaultValue: "default placeholder body"
      })
    });
    
    # App.PostsNewRoute
    var post = transaction.createRecord(App.Post);
    

    不久前,我实际上编写了一个函数来反转内容数组:

    这是一篇相当老的文章,差不多有一年了,所以它可能不会像现在这样工作,但是框架就在那里

    你可以在我写的这个小应用程序中看到它的作用:


    在顶部的输入字段中搜索用户,并观察左侧用户按从最新到最旧(而不是从最旧到最新)的顺序出现。

    感谢您的解决方案!但我仍然很好奇,当需要立即更新列表时,如何处理解决方案1。而且我在API文档上找不到sortProperties、sortAscending或filteredContent属性(甚至在Ember.SortableMixin页面中),这是我的问题还是文档的问题?您如何找到这些解决方案?因为Ember是如此新,许多文档尚未编写。了解您是否可以做某事的最好方法是阅读实际代码。在API文档中,它始终包含指向源的链接。因此,如果您转到“可排序混合”,则会有一个指向以下内容的链接:。在那里你可以看到SortProperties等的来源。至于找到解决方案,阅读代码、堆栈溢出和猜测是我经常使用的方法。因此,我必须熟悉实际的代码。。谢谢你的帮忙。这对我来说是一个巨大的支持:一个措辞复杂的问题。你的问题实际上帮助我了解了很多关于CRUD如何在Ember中工作的知识。我刚刚用
    {{{#除非这个.isSaving}
    包装了我的链接。你们认为我在演讲中加入了一些与之无关的东西吗?我也尝试了基于模板的方法,但失败了,因为我不知道如何准确地使用模板语言。我更喜欢这种方法。谢谢A无法获得公认的工作答案;如果不刷新屏幕,帖子列表将不会更新。这个答案(在模板中使用#isNew)对我来说非常有用。谢谢
    # posts.handlebars
    <ul class='posts'>
      {{#each controller}}
        {{#unless isNew}}
          <li>
            <h3>{{#linkTo post this}}{{title}}{{/linkTo}}</h3>
            <img {{bindAttr src="imageUrl"}}/>
            <a {{action deletePost}} class="delete-post tiny button">Delete</a>
          </li>
        {{/unless}}
      {{/each}}
    </ul>
    
    # App.PostsNewRoute
    var post = transaction.createRecord(App.Post, {
                title: 'default placeholder title',
                body: 'default placeholder body'
           });
    
    # App.Post
    App.Post = DS.Model.extend({
      title: DS.attr('string', {
        defaultValue: "default placeholder title"
      }),
      body: DS.attr('string', {
        defaultValue: "default placeholder body"
      })
    });
    
    # App.PostsNewRoute
    var post = transaction.createRecord(App.Post);