首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从多个urls获取模型时如何呈现视图

从多个urls获取模型时如何呈现视图
EN

Stack Overflow用户
提问于 2014-10-01 19:42:09
回答 1查看 68关注 0票数 0

我在backbone.js的项目中工作,我面临的问题是我有一个不需要与服务器同步的模型,这个模型唯一的目的是获取用户数据来初始化其余的视图,它是一个带有模型的应用程序的包装视图。

这个模型从多个urls中获取数据,而我的实际问题是视图在将所有数据赋值给模型之前(在某些情况下)是呈现的,而在其他情况下,当所有数据已经分配给模型时,视图正在呈现。

我使用$.when()来获取模型,并调用.done()来呈现视图,但我想我不理解延迟对象的概念。想知道你们有什么样的建议来解决这个问题。我给你留下一个例子,说明我的代码是怎样的。

模型

代码语言:javascript
运行
复制
      var userModel = Backbone.Model.extend({
        url: "/api/vacationtypes.json",
        defaults: {
          userName: 'anonymous',
          availableDays: 0,
          vacationType: []
        },

        initialize: function() {
          var that = this;
          _.bindAll(this,'parseAvailableDays');
        },

        parse: function(data){
          return {vacationType: data.data}
        },

        getAvailableDays: function() {
          $.ajax({
            url: "/api/staffAvailableDays/get/" + Zvacations.session.email + ".json",
            success: this.parseAvailableDays
          });
        },

        parseAvailableDays: function(response) {
          this.set('availableDays', response.data[0].availableDays);
        }

      });

视图

代码语言:javascript
运行
复制
  var Home = Backbone.View.extend({
    tagName: "section",
    className: "home",
    el: "#request-form"

    events: {
         // events for the view
    },

    initialize: function(){
      var that = this;
      this.setPageTitle('Home');
      this.model.on('change:availableDays', this.render, this);
      //  once all fetches for model are done render the view (sometime execute before the succes of getAvailableDays)
      $.when( this.model.fetch(), this.model.getAvailableDays() ).done(function(){
        that.render();
      });
    },

    render: function(){
      var template = _.template(homeViewTemplate, this.model.toJSON());
      this.$el.html(template);
      // get holydays from db
      this.getHolidays();
      //assign total steps after render
      this.totalSteps = $(homeViewTemplate).find('fieldset').length
      // initialize jQuery UI datepicker
      this.dateSelectorView();

      return this;
    },

    // here goes rest of the view methods          

   }); 

希望你们能帮我弄清楚哪一种方法是最好的等待,直到所有的抓取完成渲染。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 20:01:33

您需要从jqXHR返回getAvailableDays (ajax返回值),以便它可以与$.when一起使用。

代码语言:javascript
运行
复制
getAvailableDays: function() {
  return $.ajax({
    url: "/api/staffAvailableDays/get/" + Zvacations.session.email + ".json",
    success: this.parseAvailableDays
  });
},

现有代码将getAvailableDaysfetch的返回值传递给$.when。当您不从getAvailableDays返回任何内容时,您的代码相当于以下内容:

代码语言:javascript
运行
复制
$.when(this.model.fetch(), undefined).done(function() {
    that.render();
});

它忽略了getAvailableDays中的ajax调用。

来自jQuery文档:

如果将单个参数传递给jQuery.when(),并且它不是延迟的或承诺的,则它将被视为已解决的延迟推断,任何附加的doneCallbacks都将立即执行。

在主干内部,您会发现fetch从ajax调用返回jqXHR对象,类似于您应该如何处理getAvailableDays

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26149281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档