我应该如何声明模型当前处于"获取"状态?如何创建"on fetch complete"事件以进行绑定?

Jay*_*ayC 5 backbone.js

请注意这是关于Backbone.js的问题.这不是一个"我该怎么做"的问题,因为我很确定我可以创建自己的问题,但我不确定我的解决方案是否会"干净".问题更具概念性.我试图了解是否已经有一个惯例来做到这一点,甚至可能不是在Backbone,但更通用的东西.

这是我正在努力处理的事情.

  1. 视图已创建,但相关集合虽然已创建,但可能尚未初始化.初始化模型时,视图需要执行一些代码.如果模型已经初始化,则可以立即执行该代码.(同样,如果模型未初始化,则代码必须"等待"或"排队",直到模型初始化为止)
  2. 可以通过reset调用或fetch调用直接设置集合.

我在Backbone中意识到,有一个reset我可以绑定的事件.但是我只想绑定到reset事件,如果还没有调用reset,我只想"绑定"它"一次",所以我可能想做一些我绑定到reset事件的事情,并且在事件中处理程序,取消绑定相同的处理程序.

我也想处理这个案例(尽管我现在所说的不是严格要求它),但是可能需要设置集合或多次获取它的数据.

有人可以提供一些满足上述两个要求的样本代码(最好是所有提到的3个)吗?或者至少讨论一下我可能采取的一些方法?谢谢.

编辑:

是的,这可能需要特定的情况来描述.我也可能想要有人告诉我这是不是有点腥味.

具体情况是,我有一个路线,我有一个视图,呈现一个选择控件,实际上另一个视图,让我们称之为"路由视图",告诉视图它控制如何导航以及如何从导航路线.我不知道一个视图是否对此有好处,它似乎比我以前用于此的代码更好地遍布整个地方.

所以,假设我以用户身份进入,并且我被赋予了从选择视图和其他一些东西中选择市场的能力.路由视图绑定到实际选择控件的更改事件,以便当用户更改选择控件时,将导航到新路径,如

HTTP://localhost/SomePage.aspx# /事件搜索/市场/ SAN的安杰洛/日期/ 2012-01-04

(如您所见,添加了其他值.)

路由视图还负责从导航到视图(或小部件)的绑定,所以当网址有"/ date/2012-01-04"时,我的日期选择器的值为1/4/2012 ,或者如果我的市场有"/ market/santa-fe",则选择将显示"Santa Fe".我还在路由中设置了基于当前路由搜索的能力.这也允许我点击后退按钮和前进按钮并查看我之前的搜索,控件将始终与导航时的原始选择相匹配.很酷.

页面首次加载时会出现问题.目前我的选择控件绑定到一个模型,该模型也恰好为页面上的另一个视图提供数据(诚然,这可能不是最好的主意,但是因为我们已经在页面上深入使用了这些数据,所以它不是所以疯狂地捎带那个选择的视图).该数据是通过ajax获取的,在页面加载时不可用.然而,"路由视图" 页面加载时的初始化. 因此,当它尝试选择与当前路径相关的(文字)选项时,该选项甚至尚未呈现. 这不会导致错误,只是意味着未在选择框中选择当前市场.

就目前而言,代码执行将始终按此顺序执行,因此绑定到重置事件可能会起作用,但在将来,我可能会想到移动代码,以便模型实际上可能已经通过以下方式接收了所有数据:路由器视图初始化的时间,可能会加快页面加载等.因此,在这种情况下,我无法绑定到重置,因为模型已经被重置,我只需要在当前选择视图上选择值...即,如果它已经被渲染.

人力资源管理模式.

有些东西告诉我,我正在过度思考"错误"的东西,并解开"正确"的东西.

stu*_*ith 4

我在收藏方面也遇到过类似的问题。希望以下代码片段虽然不完全是您正在寻找的内容,但可能会有所帮助。

在集合中,我挂钩到它自己的reset事件,并将其标记为已获取:

return Backbone.Collection.extend({

    initialize: function() {
        this.isFetched = false;
        this.bind('reset', this.onReset, this);
    },

    onReset: function() {
        this.isFetched = true;
    }

});
Run Code Online (Sandbox Code Playgroud)

然后在视图中,我可以渲染整个集合,或者渲染“正在加载”消息:

return Backbone.View.extend({

    render: function () {
        if (this.myCollection.isFetched) {
            this.myCollection.each(function (x) {
                // Render single item.
            });
        } else {
            // Set a loading animation.
        }
    }

});
Run Code Online (Sandbox Code Playgroud)

显然,视图需要挂钩到集合的reset事件,并render()在它触发时调用。