Private-like properties in models or views of Backbone.js

此生再无相见时 提交于 2019-12-22 06:24:40

问题


Is it possible to have private properties in a model? Like the locally declared variables in a (constructor) function, not attached to this, but declared locally and visible only by whatever is defined in the (constructor)function. Example without BB View:

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
  ...
}

Note that internalInput is not accessible to outside world and aModel is also not accessible (through MyView at least). So if I want to use Backbone.View to implement the above MyView, how would i do it and keep $internalInput 'private'?


回答1:


You should be able to achieve private data by passing an IIFE to extend when defining your Backbone objects, rather than just a plain object. For example:

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

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



回答2:


You'd better off with

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

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



回答3:


Javascript is fun!

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;
            }
        }) )();
    };
}());

I'm a little concerned by the fact that every instance of this "Thing" is also a subclass, in the OOP lingo.




回答4:


In the context of using Broserify.js with Backbone (and really any above medium project) I found the following way to have private vars and functions:

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);
    },
});

The idea to take here is go with Browserify :P




回答5:


The simplest way is the following:

...
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));  
    }

},


来源:https://stackoverflow.com/questions/8924961/private-like-properties-in-models-or-views-of-backbone-js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!