【问题标题】:Backbone fetch() always returns same modelBackbone fetch() 总是返回相同的模型
【发布时间】:2013-08-07 23:12:45
【问题描述】:

由于某种原因,我的代码总是返回相同的模型,即使在我在 listView 页面中选择项目后我可以看到传入了正确的 id。

// main.js (relavent function)

    venueDetails: function (id) {
        // here, id is correct
        var venue = new Venue({_id: id});
        venue.fetch({success: function(){
            // here, the id of venue is changed for some reason
            console.log(venue.id);
            $("#content").html(new VenueView({model: venue}).el);
        }});
        this.headerView.selectMenuItem();
    },

模型,

// model.js (relavent model)

    var base = 'http://localhost:3000';

    window.Venue = Backbone.Model.extend({
        urlRoot: base+"/venues",
        idAttribute: "_id",
    });

    window.VenueCollection = Backbone.Collection.extend({
        model: Venue,
        url: base+"/venues?populate=true"
    });

在图片中,您可以看到model.id与url中的内容不同的地方

编辑:添加路由器映射

var AppRouter = Backbone.Router.extend({

routes: {
    ""                     : "home",
    <!-- venues -->
    "venues"               : "venueList",
    "venues/page/:page"    : "venueList",
    "venues/add"           : "addVenue",
    "venues/:id"           : "venueDetails",

【问题讨论】:

  • 您看到正确的 GET 调用和响应了吗?尝试使用 firebug 中的网络面板。
  • hmm,当它向服务器 api 发出请求时,它传入的 id 不正确。是否有一些方法我应该重写以查看它可能会替换 id 的位置?
  • 模型初始化后使用console.log(venue.id)即可。是不是打印了错误的id?同时粘贴路由器映射。

标签: jquery rest twitter-bootstrap backbone.js


【解决方案1】:

我不知道_id 属性是否在模型中被正确访问,因为venue.fetch 似乎在调用某种类型的默认值。

不妨试试:

   window.Venue = Backbone.Model.extend({
        urlRoot: base+"/venues",
        idAttribute: this.options._id,
    });

(并从选项哈希中提取 id)

如果这不起作用,请尝试动态声明 idAttribute

   window.Venue = Backbone.Model.extend({
        urlRoot: base+"/venues",
        idAttribute: function() { return this.options._id },
    });

【讨论】:

  • 对不起,我写的那段代码很晚了,我已经把它改成了 this.options
【解决方案2】:

这个

 var base = 'http://localhost:3000';

是个坏主意,完全没有必要。完全摆脱它。只需使用绝对路径(如“/venues”)作为 URL,您的应用无论在何处运行都能正常运行。

在您的代码和屏幕截图之间有 2 个不同的端口。您确定您正在与正确的应用程序服务器通信吗?

否则,您是否检查过服务器端代码是否存在错误?这可能很简单,因为服务器端代码在查询数据库时使用了错误的值。

【讨论】:

  • 现在,API 与 UI 应用程序分开托管。这就是为什么我在那里有这个完整的网址 - 它们位于不同的端口上。我是骨干新手,所以如果有更好的方法,我会全力以赴!
  • 好的,我继续将 ui 应用程序合并到 api 项目中以简化事情。在获取错误模型的情况下,我仍然得到相同的结果。
  • 哎呀!我的服务器端代码确实有错误。我正在使用 Mongoose,并且使用的是 findOne() 而不是 findById()。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多