【问题标题】:not able to extend model from different file in backbone.marionette with require.js无法使用 require.js 从backbone.marionette 中的不同文件扩展模型
【发布时间】:2014-08-06 07:06:17
【问题描述】:

我正在尝试学习和制作backbone.marionette 应用程序,但有以下两个疑问/问题:

1) 如果用户已经登录,我正在尝试将用户重定向到主页,而不是默认登录页面。为了检查用户是否已经登录,我在模型中使用了 jquery.cookie 并在木偶应用程序启动时使用该模型类检查重定向的位置。 cookie 工作正常,我从 cookie 中获取值,但我的应用程序没有路由到主页。我在应用启动 event.App.on("start", function(options) {var session = new UserSession(); // UserSession 是包含 jquery.cookie 部分的模型 if (session.authenticated()) { console.log("redirecting..."); App.trigger("users:list"); console.log("redirected"); } } 在另一个文件中我有 App.addInitializer( function (options) { new Backbone .Marionette.AppRouter.extend({ appRoutes: { "users": "listUsers" }, controller: MyRouteCtlr } }); App.on("users:list", function(){ console.log("触发的用户列表" ); App.navigate("users"); MyRouteCtlr.listUsers(); }); 控制台输出是:重定向...重定向我在这里缺少什么?如何在页面刷新时将用户重定向到默认页面以外的其他页面检查cookie登录后?顺便说一句,我正在使用Require.js作为依赖项。

更新:我已经解决了第一点,这是由于 require 函数中的加载顺序。

2) 另一件事是我尝试制作一个基本模型,而不是让所有其他人扩展该模型。因此,我在一个文件中创建了基本模型,如下所示:

define([
    'backbone'
],
function( Backbone ) {
    'use strict';
    return Backbone.Model.extend({
        initialize: function() {
            console.log("BaseModel");
        },

        defaults: {}
    });
});

然后我尝试在另一个文件中将其扩展为:

define([
    'backbone',
    'localstorage',
    'base-model'
],
function( Backbone, BaseModel ) {
    'use strict';
    return BaseModel.extend({
        initialize: function() {
            console.log("sub model");
        },
    });
});

但是当我运行它时,它会在return BaseModel.extend(... 行出现错误,说undefined is not a function。如果我在同一个文件中编写基本模式,则运行得非常好,但不能使用不同的文件。我想将它放在不同的文件中,以便所有其他模型也可以扩展它。同样的事情适用于没有任何错误的视图。这里出了什么问题,我该如何解决?

扩展类中的 BaseModel 打印 Backbone.LocalStorage.window.Store {name: undefined, serializer: Object, records: Array[0], save: function, create: function…} 而在包含应用程序对象的主 js 中打印 child {cid: "c2", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…}

【问题讨论】:

  • 1) backbonejs.org/#Router-navigate 2) 如果你这样做了console.log(BaseModel) 我想它是未定义的,你不需要正确的路径
  • @DominicTobias 2) 它打印Backbone.LocalStorage.window.Store {name: undefined, serializer: Object, records: Array[0], save: function, create: function…}
  • 听起来不对,模型没有序列化(这通常是您在发送到模板时在视图中执行的操作)方法,并且其中还有其他内容,例如记录和 localStorage非默认,所以我认为上面的代码不完整?
  • @DominicTobias 第二点,这就是我在两个模型中所拥有的。我还没有做任何花哨的事情。
  • @DominicTobias 有趣的是,当我在 App.on('start', function(){...}) 上打印相同的内容时,它的打印结果类似于 child {cid: "c2", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…},这实际上看起来是正确的。

标签: jquery backbone.js cookies routes marionette


【解决方案1】:

您的 BaseModel 中未定义扩展。为了这些目的,我总是使用 Jquery 扩展方法。你可以这样定义:

define([
    'backbone',
    'jquery'
],
function( Backbone, $) {
    'use strict';
    return Backbone.Model.extend({
        initialize: function() {
            console.log("BaseModel");
        },

        extend : function(obj){
           return $.extend(true, obj, this);
        },

        defaults: {}
    });
});

但实际上你可以自己实现扩展(如果你不想使用 jquery 扩展方法),这很容易。您只需将所有字段和函数从一个对象转移到另一个对象。

现在您可以像这样使用您的基本模型:

BaseModel.extend({//...});

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多