Частные свойства в моделях или представлениях Backbone.js - PullRequest
6 голосов
/ 19 января 2012

Можно ли иметь частные свойства в модели? Как и локально объявленные переменные в функции (конструктора), не присоединенные к this, но объявленные локально и видимые только тем, что определено в функции (конструктора). Пример без 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
  ...
}

Обратите внимание, что internalInput недоступен для внешнего мира и aModel также недоступен (по крайней мере, через MyView). Поэтому, если я хочу использовать Backbone.View для реализации вышеупомянутого MyView, как бы я это сделал и оставил $ internalInput 'private'?

Ответы [ 5 ]

10 голосов
/ 19 января 2012

Вы должны иметь возможность получать личные данные, передавая IIFE в extend при определении объектов Backbone, а не просто обычный объект. Например:

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

  return {
    bar: function () {
      console.log(foo);
    }
  };
})());
3 голосов
/ 14 января 2014

Тебе лучше с

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

            this.getValue = function ()
            {
                return _value;
            };
            this.setValue = function (value)
            {
                _value = value;
            };
        }
    });
0 голосов
/ 12 ноября 2015

Самый простой способ следующий:

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

},
0 голосов
/ 28 сентября 2014

В контексте использования 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

0 голосов
/ 18 февраля 2014

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

Меня немного беспокоит тот факт, что каждый экземпляр этого "Вещи" также является подклассом в ООП-жаргоне.

...