无法使用require.js从backbone.marionette中的不同文件扩展模型

时间:2014-08-06 07:06:18

标签: jquery backbone.js cookies routes marionette

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

<德尔> 1) 我正在尝试将用户重定向到主页,而不是默认登录页面,如果他已经登录。要检查用户是否已登录我在模型中使用了jquery.cookie并在启动木偶应用程序时使用该模型类检查重定向的位置。 cookie工作正常,我从cookie获取值,但我的应用程序没有路由到主页。我在app start event.App.on上执行此操作(“start”,function(options){var session = new UserSession(); // UserSession是包含jquery.cookie part if(session.authenticated()){的模型console.log(“redirecting ...”); App.trigger(“users:list”); console.log(“redirected”);}}在另一个文件中我有App.addInitializer(函数(选项){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 个答案:

答案 0 :(得分:1)

extend未在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({//...});