【问题标题】:Where should I put view related constants - backbone.js我应该把视图相关的常量放在哪里-backbone.js
【发布时间】:2011-05-26 17:56:31
【问题描述】:

想象我有一个视图,作为视图的一部分,它渲染“x”模型对象,并且只渲染“x”。问题是,我把这个与视图相关的常量放在哪里合适?

我的猜测是这样做:

myApp.MyView = Backbone.View.extend({
    ...
    myConstant: 10,
    ...
    render: function(){
        ...
        //some code that uses myConstant
        ...
    }
});

这有意义吗?

任何建议都有帮助!

【问题讨论】:

    标签: view constants conventions backbone.js


    【解决方案1】:

    听起来您想要做的是为视图分配一个类属性。您可以将第二个哈希传递到您的扩展调用中来执行此操作。您的代码将如下所示:

    myApp.MyView = Backbone.View.extend({
    
        render: function() {
            alert(myApp.MyView.myConstant);
        }
    
    }, {
    
        myConstant: 10
    
    });
    

    您的常量可作为 myApp.MyView.myConstant 访问。

    【讨论】:

    • 谢谢。我接受了这一点,因为我不知道类属性,但我的真正问题略有不同。不是我可以这样做,而是我应该这样做。让这些类型的属性随处可见是否被认为是一种好习惯?
    • 谢谢,完全理解。如果这是 Java,您将在类上附加一个常量。您的替代方法是设置一些全局常量,但随后它将是全局的,而不是与其相关的关注点命名空间。我会说这是一种很好的做法,尽管我愿意接受其他人的意见。
    • 我真的很喜欢这个解决方案。但是,为了清楚起见,我会添加一个单独的扩展而不是即时执行。不过,这只是个人喜好。
    【解决方案2】:

    你非常接近!实际上,您将只使用 this.myConstant。这是一个工作示例...

    testView = Backbone.View.extend({
        test: "hello world!",
    
        initialize: function(){
            alert( this.test );
            _.bindAll(this, "render");
        },
    
        render: function(){
            //do your rendering...
            return this;
        }
    });
    var view = new testView();
    

    【讨论】:

      【解决方案3】:

      如上所述,我同意(并赞成)接受的答案,但为了清楚起见,我很想采用这种格式:

      myApp.MyView = Backbone.View.extend({
          render: function() {
              alert(myApp.MyView);
          }
      });
      
      _.extend(myApp.MyView.prototype, {
        enum : {
            //...
        }
      });
      

      原因是您的视图可能有很多 mixin,而我发现当您继续将一个又一个对象添加到 View.extend 时,可见性变得模糊。至少通过这种方式,您可以将其分解并将 cmets 放在您的 mixin 之间。如果您使用 RequireJS 并加载一组通用的枚举/混合,这也更有意义。

      【讨论】:

      • 正确的语法是什么? myApp.MyView.enum 是未定义的。
      • 哦,原来如此,新的 myApp.MyView().enum。谢谢。
      • @eugene - 这只是解决问题的一种方式。关键是它位于视图实例上。请参阅下面 omeralper 的评论,因为这可能不是您想要做的。
      【解决方案4】:

      不要在extend 下初始化视图常量,对于所有视图实例,它的行为就像静态常量。改用构造函数:

      constructor: function()
      {
           Backbone.View.prototype.constructor.apply(this, arguments);
           this.myConstant = 10;
           this.myOtherConstant = {};
      }
      

      more explanation here

      【讨论】:

      • 如果您不希望常量成为原型的一部分,只需扩展实例即可。通常我将常量保存在单独的控制器/模块中(有时在集合中)。
      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2016-08-25
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多