在一个视图中设置模型并在另一个视图中访问它 - 骨干

时间:2015-10-20 11:58:36

标签: backbone.js underscore.js models router

视图1

this.orderDataModel.set({
    channel_id: channel_id,
    channel_type: channel_type
}, { silent: true });

假设我在一个视图中设置我的模型我可以在另一个视图中访问它吗?

视图2

this.orderDataModel = new orderDataModel();
console.log(this.orderDataModel);
console.log(self.orderDataModel.get("channel_id")); //undefined

我没有属性?

编辑:

我通过路由器调用第二个视图

manifestDetails: function (id) {
    "use strict";
    var optionsManifest = { manifestId: id };
    if (this.manifestDetail) {
        this.manifestDetail.initialize(optionsManifest)
    } else {
        this.manifestDetail = new manifestDetailsView(optionsManifest);
    }

    this.manifestDetail.render();
}

1 个答案:

答案 0 :(得分:3)

只要两个视图都附加了相同的模型,它们都应该能够访问模型属性。 可能发生的事情是,他们要么不使用相同的模型,要么就是在实际发生变化之前尝试打印变更。

正如您在此示例中所见:

http://jsfiddle.net/m9vfrhmL/1/

(点击红色名称进行更改)。

如您所见,当您单击文本时,仅第二个视图正在更改。之所以会发生这种情况,因为只有第二个视图实际上是在监听模型中的变化,而第一个视图是麻木的(即使它们引用了相同的模型!)。 因此,将listenTo添加到每个视图将很容易解决问题:

var View1 = Backbone.View.extend({
    el: '#myName1',
    initialize: function(){
        this.listenTo(this.model,"change",this.render);
    },
    render: function(){
        this.$el.text(this.model.get("name"))
    }
});

var View2 = Backbone.View.extend({
    el: '#myName2',
    events:{
        'click' : 'changeName'
    },
    changeName: function(){
        this.model.set({name:"vini"});
    },
    initialize: function(){
        this.listenTo(this.model,"change",this.render);
    },
    render: function(){
        this.$el.text(this.model.get("name"))
    }
});

var model = new Backbone.Model();

var view1 = new View1({model:model});

var view2 = new View2({model:model});

model.set({name:"mor"})

http://jsfiddle.net/5h9Les7q/5/

无论如何,使用silent:true将导致更改事件不会被触发,我认为在这种情况下不需要。