Backbone.js将子变量保持为父变量

时间:2012-02-23 20:18:46

标签: javascript backbone.js hierarchy

在Backbone.js中对父进行操作时,保持继承变量的正确方法是什么? 我可以看到一些合乎逻辑的方法来做到这一点,但它们看起来效率低下,并认为可能值得寻求另一种意见。

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

1 个答案:

答案 0 :(得分:5)

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

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

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