首页 > 解决方案 > 骨干全局模型

问题描述

我怎样才能只获取一次模型并保留它以在不同条件下进行渲染?

define(
    ["backbone", "jquery", "app/config", "app/TemplateManager", "app/User"],
    function(Backbone, $, config, TemplateManager, User) {

        var HeaderView = Backbone.View.extend({

            tagName: "div",
            className: "window-header",
            User: new User,

            events: {
            },


            initialize: function() {
                var User = this.User;
                if(!(this.model instanceof Backbone.Model)) {
                    this.model = User;
                }

                this.listenTo(Backbone, "dialog:open", this.dialogOpen);
                this.listenTo(Backbone, "contacts:open", this.contactsOpen);
                this.listenTo(Backbone, "window:close", this.restoreDefaults);

                this.restoreDefaults();
                // this.render();
            },


            render: function() {
                var self = this;
                TemplateManager.get("window-header", function(template) {

                    self.model.validate();
                    self.$el.html(template(self.model.toJSON()));

                    $("#window").prepend(self.$el);
                });

                return this;
            },


            dialogOpen: function(contact) {
                this.model.set(contact.attributes);
                this.render();
            },


            contactsOpen: function() {
                if(!this.User.has("id")) {
                    var self = this;
                    this.User.fetch({
                        success: function(model, response, options) {
                            self.model.set(self.User.attributes);
                            self.render();
                        }
                    });
                } else {
                    this.model.set(this.User.attributes);
                    this.render();
                }
            },


            restoreDefaults() {
                this.model.set(this.User.defaults());
                this.render();
            },

        });

        return HeaderView;
    }
);

所以在我的应用程序中它应该是 WindowHeader 的 3 种状态

  1. 默认恢复默认值()
  2. 使用接触模型属性 dialogOpen() 渲染
  3. 使用用户数据 contactsOpen() 渲染

我不想每次都获取用户数据是否可以执行一次并将其存储在某个变量中?但是当我每次调用 restoreDefaults() 时 this.User 也被清除为默认值。为什么?为什么 this.User 等于 this.model?即使我这样做

var User = this.User;
this.model = User;

是平等的吗?

this.model = this.User

我想不会。我错了吗?我能做些什么?

标签: javascriptbackbone.js

解决方案


this.modelUser是同一个对象(同一个引用)。

好的做法是您无需保留User在此视图中。无需这样做User: new User

无需为模型设置新数据this.model.set(this.User.defaults()); 我认为你不应该改变用户模型。如果需要,您可以创建另一个模型,不要直接接触用户模型。

注意:new HeaderView({model: User}). 模型参数是特殊选项,如果通过,将直接附加到视图。所以你可以在视图中访问this.model


推荐阅读