【问题标题】:Error at backbone model fetch to slim framework骨干模型提取到苗条框架时出错
【发布时间】:2014-06-09 20:20:41
【问题描述】:

我正在尝试让一个简单的应用程序正常工作。它使用主干、苗条的框架和科尔多瓦。现在,我要做的就是从 MySQL 数据库中获取用户模型。客户端代码如下:

// Cordova is ready
function onDeviceReady()
{
    // This little code snippet prepends our root to any Ajax call.
    $.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
        options.url = 'http://localhost/~nmeibergen/IBMI/www/' + options.url;
    });

    var profileView = new ProfileView();

    var Router = Backbone.Router.extend({
        routes: {
          "": "home"
        }
    });

    var router = new Router();
    router.on('route:home', function() {
        profileView.render();   
    });

    Backbone.history.start();
}

var Users = Backbone.Collection.extend({
    url: 'index.php/users',
    model: User
});

var User = Backbone.Model.extend({
    urlRoot: 'index.php/users',

    defaults: {
        user_id: 1,
        name: 'Nathan',
    }
});

var ProfileView = Backbone.View.extend({

    el: '#home',

    render: function () {
        var users = new Users();
        alert('all fine');
        users.fetch();
    }
});

只要我只是去http://localhost/~nmeibergen/IBMI/www/index.php/users,我就会得到预期的 JSON 对象:

[{"user_id":"1","name":"Jhonathan "},{"user_id":"0","name":"Nathan"}]

但是,当运行上述代码时,它会出现“一切正常”的警报,但随后会出现以下错误和堆栈跟踪:

TypeError: 'undefined' is not an object (evaluating 'targetModel.prototype') in backbone.js:1:689
            set        backbone.js:1:689
            success    backbone.js:1:686
            fire       jquery-1.11.1.js:3119
            fireWith   jquery-1.11.1.js:3231
            done       jquery-1.11.1.js:9275
            callback   jquery-1.11.1.js:9685

我似乎无法找出代码有什么问题,它应该是非常基本的。感谢您的关注!

【问题讨论】:

  • @muistooshort:我刚刚编辑了我的问题,包括非缩小主干中的堆栈跟踪:)

标签: backbone.js cordova slim


【解决方案1】:

当你这样说时:

var x = 6;

var x 声明将被提升到当前范围的顶部。但是,分配部分将不会被吊起。结果是你这样说:

var x;
// Everything from the top of the scope to your `var x = 6` goes here.
x = 6;

在你的情况下,你正在这样做:

var Users = Backbone.Collection.extend({
    url: 'index.php/users',
    model: User
});

var User = Backbone.Model.extend({
    urlRoot: 'index.php/users',

    defaults: {
        user_id: 1,
        name: 'Nathan',
    }
});

所以var User 被提升到范围的顶部,但User = Backbone.Model.extend(...) 发生在之后 Users = Backbone.Collection.extend(...)。重新排列代码以匹配实际发生的情况,我们有:

var Users, User;

Users = Backbone.Collection.extend({
    //...
    model: User
});
User = Backbone.Model.extend({
    //...
});

您认为User 的值在Users 的定义中使用时会是什么? User 将是 undefined 就像任何其他未初始化的变量一样。

演示:http://jsfiddle.net/ambiguous/xYkmc/

你需要在Users之前定义你的User

var User = Backbone.Model.extend({
    urlRoot: 'index.php/users',

    defaults: {
        user_id: 1,
        name: 'Nathan',
    }
});

var Users = Backbone.Collection.extend({
    url: 'index.php/users',
    model: User
});

演示:http://jsfiddle.net/ambiguous/E7V84/

【讨论】:

  • 谢谢,非常感谢!这些都是我很想知道的很棒的内幕。它解决了问题:):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2013-10-14
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多