Backbone里两个view(或者说collection)怎么交互?

发布于 2022-08-28 12:30:18 字数 556 浏览 9 评论 0

我有viewA、viewB,分别对应collectionA、collectionB(他们model类型相同)
目标:点击viewA中一个元素时,将这个元素对应的model添加到collectionB,viewB同上所述
我该怎么做?

var ViewA = Backbone.ViewA.extend({
  el: $('xxx'),
  .....
  events: {
   "click": "trans"
  },
  trans: function(event) {
    var index = event.target.dataset.n;//通过data、元素index之类乱七八糟的获取序列号,总之不重要
    //我疑惑的是下面的
    var model = this.collection.at(index);
    collectionB.add(model) //这样也太傻了吧
  }
});
var viewA = new ViewA({collection: collectionA})

感觉别别扭扭,依赖乱七八糟的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

枕梦 2022-09-04 12:30:18

楼主的意思比较清楚,而且感觉是对的,乱乱的,其实是因为这样写会太耦合,ViewA不应该包含ViewB

而最好通过事件进行交互。

如:

var eventAcrossView = _.extend({}, Backbone.Events);

// view one needs to trigger an event in view2
ViewA = Backbone.View.extend({

    trans: function(event) {
        eventAcrossView.trigger('viewAClicked', { 'some' : 'data' } );
    })
})

ViewB = Backbone.View.extend({
    initialize: function() {
        eventAcrossView.on('viewAClicked', this.onViewAClicked, this);
    },
    onViewAClicked : function() {
        // update model
    }
})
一人独醉 2022-09-04 12:30:18
var ViewA = Backbone.View.extend({
  el: $('xxx'),
  events: {
   "click": "trans"
  },
  trans: function(event) {
    var index = event.target.dataset.n;
    var model = this.collection.at(index);
    this.trigger('trans', model)
  }
});

var ViewB = Backbone.View.extend({
  receive: function (model) {
    this.collection.add(model)
  }
});

var viewA = new ViewA({collection: collectionA})
var viewB = new ViewB({collection: collectionB})

// 这样
viewA.on('trans', function (model) {
  viewB.receive(model)
})

// 或者
viewB.listenTo(viewA, 'trans', function (model) {
  this.receive(model)
})

如果没有弄懂Backbone,不建议碰Marionette,因为用不好它。

口干舌燥 2022-09-04 12:30:18

View 是用来做什么的?它是用来 render 内容的,所以对数据本身的操作详细过程怎么可以封装到 View 里面?你可以在 View 里面对 Model 进行操作,但是操作本身请定义在 Model 或者 Collection 内。
此外,Backbone 直写复杂页面交互逻辑时确实不太好组织代码,所以我推荐你使用 Marionette + Backbone,像现在这种情况的话,在 Marionette 内可以使用 CollectionView 来处理 Collection,而使用 ItemView 来处理单个 Model 的情形。

苏别ゝ 2022-09-04 12:30:18

楼主的代码,我觉得写的没问题。不知楼主究竟是哪里不满意,想写成什么样子?

甜中书 2022-09-04 12:30:18

我觉得这完全看复用,如果viewA viewB都不会在别的地方复用,那怎么耦合都无所谓,没必要故意拆

如果其中某一个view会被复用,那么想想怎么被复用就知道怎么解耦了

顺便说一下以我揣测的这个系统的其余部分,我的做法可能是把A和B抽一个共同部分ListView出来,列表视图能够输出列表项被点击的事件,然后为题主这个情形写个新的叫ABListView之类的玩意儿

    #new ABListView({A: CollectionA, B: CollectionB})

    ABListView = View.extend
        initialize: (option)->
            this.children = [option.A, option.B].map (collection, k)->
                child = new ListView {collection: collection}
                child.on 'itemClick', this.childItemClick
                child

        childItemClick: (event)->
            #假设event已经有我们要的"本次点击对应view"和“本次点击对应model”
            #1-k 就是 1<==>0 互换
            this.children[1 - this.children.indexOf event.view].collection.add event.model

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文