Backbone.js的模型或视图中类似私有的属性

时间:2012-01-19 11:04:09

标签: javascript backbone.js private

是否可以在模型中使用私有属性?就像(构造函数)函数中的本地声明的变量一样,没有附加到this,而是在本地声明,只能通过(构造函数)函数中定义的任何内容来显示。 没有BB视图的示例:

function MyView(aModel){

  var $internalInput = $('<input>');

  this.render: function($where){
     $internalInput.val(aModel.get('SomeProperty'));
     $where.append($('<div class="inputWraper">').append($internalInput));
  };
  this.toggleReadonly: function() {
    toggle $internalInputs readonly attribute
  }
  ...
  + Code to bind input.val to some aModel property(ies) and setup events
  ...
}

请注意,外部世界无法访问internalInput,并且aModel也无法访问(至少通过MyView)。 因此,如果我想使用Backbone.View来实现上面的MyView,我该如何做并保持$ internalInput'private'?

5 个答案:

答案 0 :(得分:10)

在定义Backbone对象时,您应该能够通过将IIFE传递给extend来实现私有数据,而不仅仅是普通对象。例如:

var Thing = Backbone.Model.extend((function () {
  var foo = "Private data!";

  return {
    bar: function () {
      console.log(foo);
    }
  };
})());

答案 1 :(得分:3)

你最好用

var Thing = Backbone.Model.extend(
    {
        constructor : function ()
        {
            var _value = "Private data!";

            this.getValue = function ()
            {
                return _value;
            };
            this.setValue = function (value)
            {
                _value = value;
            };
        }
    });

答案 2 :(得分:0)

Javascript很有趣!

var Thing = (function () {
    var number_of_things = 0;

    return function (options) {
        var value = "Private data!";

        return new ( Backbone.Model.extend({
            constructor: function constructor () {
              number_of_things += 1;
            },

            getValue: function getValue () {
                return value;
            }
        }) )();
    };
}());

我有点担心这个“Thing”的每个实例在OOP术语中也是一个子类。

答案 3 :(得分:0)

在使用Broserify.js与Backbone(以及任何上述中型项目)的上下文中,我找到了以下方式来获得私有变量和函数:

myView.js

'use strict';

var config     = require('../config.js'),

    private_var   = 'private variable',
    my_private_fn = function() {
        ...
    };


module.exports = Backbone.Model.extend({
    initialize: function() {
        this.my_public = 'public variable');

        console.log('This is my' + this.my_public);
        console.log('This is my' + my_private);
    },
});

这里采取的想法是使用Browserify:P

答案 4 :(得分:0)

最简单的方法如下:

...
initialize:function(properites){            
    // Init the logic with private and public methods/variable
    this.logic.initFirst(this);
    // Use public methods
    this.logic.doSomething();
},  

logic:{         
    initFirst:function(modelOrView){
        // Do not continue if already initiated
        if( this.instance !== undefined ) return;

        // Write all logic here
        this.instance = (function(logic, modelOrView){               
            // Private variables
            var private = "private";                

            // Public methods
            logic.doSomething = function(){
                console.log(private, modelOrView);
            };  

            // Private methods
            function hidden(){

            }

        }(this, modelOrView));  
    }

},