Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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/0/backbone.js/2.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 绑定到集合的主干重置事件在集合加载数据时未触发_Ruby On Rails_Backbone.js_Backbone.js Collections - Fatal编程技术网

Ruby on rails 绑定到集合的主干重置事件在集合加载数据时未触发

Ruby on rails 绑定到集合的主干重置事件在集合加载数据时未触发,ruby-on-rails,backbone.js,backbone.js-collections,Ruby On Rails,Backbone.js,Backbone.js Collections,我是主干网新手,从Todos示例开始工作。在此之后,我创建了一个新版本的示例,用于联系人而不是TODO,它使用RubyonRails web应用程序及其关联的RESTAPI而不是localstorage来实现持久性。在进行修改之后,我能够成功地让主干应用程序更新Rails应用程序,但我无法获得主干视图来呈现主干应用程序从Rails REST API接收的数据。我已在调试器中逐步查看了代码,可以看到: 调用函数来填充视图的事件将绑定到模型集合 当我获取模型数据时,集合将使用来自服务器的数据进行更新

我是主干网新手,从Todos示例开始工作。在此之后,我创建了一个新版本的示例,用于联系人而不是TODO,它使用RubyonRails web应用程序及其关联的RESTAPI而不是localstorage来实现持久性。在进行修改之后,我能够成功地让主干应用程序更新Rails应用程序,但我无法获得主干视图来呈现主干应用程序从Rails REST API接收的数据。我已在调试器中逐步查看了代码,可以看到:

  • 调用函数来填充视图的事件将绑定到模型集合
  • 当我获取模型数据时,集合将使用来自服务器的数据进行更新
  • 但是,绑定到集合的重置事件不会触发
  • 有人能告诉我是什么导致重置事件未触发吗?我的代码如下:

    收藏

    var ContactsList = Backbone.Collection.extend({
      model: Contact,
      url: 'http://localhost:3000/contacts.json',
    });
    
    var Contacts = new ContactsList;
    
    AppView:

    var AppView = Backbone.View.extend({
    
      el: $("#contactapp"),
      events: {
        "keypress #new-contact":  "createOnEnter"
      },
    
      initialize: function() {
    
        this.input = this.$("#new-contact");
    
        Contacts.bind('add', this.addOne, this);
        Contacts.bind('reset', this.addAll, this);
        Contacts.bind('all', this.render, this);
    
        Contacts.fetch();
      },
    
      addOne: function(contact) {
        var view = new ContactView({model: contact});
        this.$("#contact-list").append(view.render().el);
      },
    
      addAll: function() {
        Contacts.each(this.addOne);
      },
    
      createOnEnter: function(e) {
        if (e.keyCode != 13) return;
        if (!this.input.val()) return;
    
        Contacts.create({first_name: this.input.val()});
        this.input.val('');
      },
    
    });
    
    var App = new AppView;
    

    您可能会看到视图中的
    el:$(“#contactsapp”)
    配置返回一个空的jQuery选择器

    不要将jQuery选择器用作对象文字值。使用主干视图,您只需提供选择器字符串:

    el:#contactsapp”

    但无论如何,这是个坏主意。您应该让视图呈现它自己的el,并使用其他代码用视图填充“#contactsapp”元素:

    $(function(){
      view = new AppView();
      view.render();
      $("#contacts").html(view.el);
    });
    

    有关更多信息,请参见上面的链接。

    经过大量调试后,我发现绑定的
    重置
    事件没有被触发,因为我使用的是旧版本的backbone.js。在版本中,我使用的是
    刷新
    事件,而不是
    重置
    事件。一旦升级到较新版本的backbone.js,就会触发
    reset
    事件

    ,因此在发生重置时不会调用
    addAll
    ?你在那里放了一个断点,让它飞了?没错。我在整个过程中都放置了断点,可以看到事件绑定到集合和获取数据。从那里,它只是继续前进,而不是调用addAll。有什么想法吗?很难说,根据你的代码。我在backbone.js的第746行和第759行设置了一个断点,查看事件是否被触发,以及您的函数是否在该时间点绑定到事件。在我的backbone.js中,第746行是:“this.iframe.document.open().close();”这是您所指的线路吗?请尝试调用
    Contacts.reset()
    ,查看事件是否触发。我更正了此问题,但仍然存在相同的问题。在Contacts.fetch()之后,不会触发重置事件。