【问题标题】:Backbone.js Persisting child variables to parentBackbone.js 将子变量持久保存到父变量
【发布时间】:2012-02-23 20:18:45
【问题描述】:

在 Backbone.js 中对父级执行操作时,持久化继承变量的正确方法是什么? 我可以看到一些合乎逻辑的方法来做到这一点,但它们似乎效率低下,我认为可能值得征求其他意见。

这两个类都是构造要保存到集合中的新模型的视图,父级将变量传递到可以设置此变量的弹出窗口。

【问题讨论】:

    标签: javascript backbone.js hierarchy


    【解决方案1】:

    我不确定你的问题是否有足够的细节来回答,但有几种方法可以做到这一点:

    • 共享一个通用模型。 正如您所描述的,您使用两个视图来构建一个模型,因此最简单的方法可能是将模型本身传递给子视图并让子视图视图修改模型,而不是在视图之间传递任何变量:

      var MyModel = Backbone.Model.extend({});
      
      var ParentView = Backbone.View.extend({
          // initialize the new model
          initialize: function() {
              this.model = new MyModel();
          },
      
          // open the pop-up on click
          events: {
              'click #open_popup': 'openPopUp'
          },
      
          openPopUp: function() {
              // pass the model
              new PopUpView({ model: this.model })
          }
      });
      
      var PopUpView = Backbone.View.extend({
          events: {
              'change input#someProperty': 'changeProperty'
          },
      
          changeProperty: function() {
              var value = $('input#someProperty').val();
              this.model.set({ someProperty : value });
          }
      });
      
    • 在父节点上触发事件。如果由于某种原因您不能只通过模型传递值,您可以只传递对父节点的引用并触发事件:

      var ParentView = Backbone.View.extend({
          initialize: function() {
              // bind callback to event
              this.on('updateProperty', this.updateProperty, this);
          },
      
          updateProperty: function(value) {
              // do whatever you need to do with the value here
          },
      
          // open the pop-up on click
          events: {
              'click #open_popup': 'openPopUp'
          },
      
          openPopUp: function() {
              // pass the model
              new PopUpView({ parent: this })
          }
      });
      
      var PopUpView = Backbone.View.extend({
          events: {
              'change input#someProperty': 'changeProperty'
          },
      
          changeProperty: function() {
              var value = $('input#someProperty').val();
              this.options.parent.trigger('updateProperty', value);
          }
      });
      

    【讨论】:

    • 完美,事件触发正是我想要的。
    • 很高兴这有帮助。请注意,第一个选项(传递模型)也会触发一个事件(模型上的“change:someProperty”事件),在我看来可能更直接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多