2012-01-19 7 views
6

Czy możliwe jest posiadanie prywatnych właściwości w modelu? Podobnie jak lokalnie zadeklarowane zmienne w funkcji (konstruktor), niepowiązane z this, ale deklarowane lokalnie i widoczne tylko przez to, co jest zdefiniowane w funkcji (konstruktor). Przykład bez BB Widok:Własności podobne do prywatnych w modelach lub widokach Backbone.js

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

Zauważ, że internalInput nie jest przystosowany do świata zewnętrznego i aModel również nie jest dostępny (poprzez MyView przynajmniej). Więc jeśli chcę użyć Backbone.View do implementacji powyższego MyView, w jaki sposób mogę to zrobić i zachować $ internalInput 'private'?

+1

Uwaga: jedyną rzeczą, którą "prywatnie" osiąga, jest spowolnienie kodu. – Raynos

+0

Czy możesz opracować proszę? Po prostu chcę tego dla celów ukrywania informacji, więc mogę to zmienić w przyszłości, bez obawy, że ktoś może na tym polegać, wykorzystując go bezpośrednio. Ale jeśli oznacza to spowolnienie kodu, to jest to problem. Gdzie mogę znaleźć więcej informacji na temat Twojego roszczenia? – Paralife

+1

[Zamknięcia mają ogromne obciążenie] (http://stackoverflow.com/a/8729939/419970), [Stan prywatny jest drogi, ale można go zrobić lepiej] (http://raynos.org/blog/23/Prototypes-and -prywatny stan). Moim osobistym zaleceniem jest użycie '_foo' dla _wewnętrznych_ właściwości, które prawdopodobnie ulegną zmianie. Również, jeśli ktoś zależy od właściwości _internal_, to jest to problem, kiedy zmienia się API, a nie twój problem. – Raynos

Odpowiedz

10

Powinieneś być w stanie uzyskać prywatne dane przechodząc IIFE do extend podczas definiowania obiektów szkieletu, a nie tylko zwykłego obiektu. Na przykład:

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

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

To dałoby coś bardziej zbliżonego do prywatnej właściwości statycznej. Jeśli chcesz emulować prywatne właściwości instancji (takie jak technika var-in-constructor OP), zostaniesz rzucony przez wspólny stan, który ci pozostawi. – matthewwithanm

+0

Niewątpliwie zadziała, ale czy jest to jedyny/lepszy sposób na uzyskanie prywatnych zmiennych w sieci szkieletowej? Ta odpowiedź mówi inaczej podejście http://stackoverflow.com/a/16320901/2253756 – KShirish

2

Lepiej mecz

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

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

, więc inaczej używać 'initialize' i' constructor'? –

+0

Tak, zapoznaj się z odpowiedzią tutaj: https://stackoverflow.com/questions/10118988/whats-the-difference-between-initialize-and-constructor-on-a-backbone-model –

0

Javascript jest zabawa!

Jestem trochę zaniepokojony faktem, że każda instancja tej "Rzecz" jest również podklasą w języku Ligi OOP.

0

W kontekście korzystania Broserify.js z Backbone (i naprawdę każdy powyżej średniej projektu) znalazłem następujący sposób na prywatne Vars i funkcje:

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

na pomysł, aby wziąć tutaj jest iść z Browserify: P

0

Najprostszym sposobem jest następujący:

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

}, 
Powiązane problemy