2011-09-27 14 views
12

रीढ़ की हड्डी में देखें कि आप अपने निजी चर और अपने सार्वजनिक कहां रखेंगे।रीढ़ की हड्डी के दृश्य में निजी और सार्वजनिक चर

अभी मैं कुछ इस तरह है:

myView = Backbone.View.extend({ 

    initialize: function(options){ 
    this.myPublic = "I'm public"; 
    } 

}); 

मैं इनिशियलाइज़ विधि से पहले एक var myPrivate जोड़ने की कोशिश की लेकिन यह एक त्रुटि फेंक दिया। निजी चर जो केवल दृश्य के भीतर उपयोग किए जाते हैं?

+0

आप क्यों तुम समझा सकते हैं ऐसा करने की कोशिश कर रहे हैं? वास्तव में एक सीधा आगे समाधान नहीं है। – Gazler

+0

एपर्ट को समझाने के लिए बहुत कुछ नहीं है कि मैं एक दृश्य में एक निजी संपत्ति कैसे जोड़ सकता हूं। उदाहरण var myPrivate = "निजी संपत्ति" लेकिन यह पूरे दृश्य के लिए उपलब्ध होना चाहिए जैसा कि यह है। मेरा सार्वजनिक है। इसे छोड़कर। MyPublic को दृश्य उदाहरण से एक्सेस किया जा सकता है। myPrivate केवल दृश्य विधियों के भीतर से ही उपयोग किया जा सकता है – Chapsterj

+1

यह उत्तर देखें: http: // stackoverflow।कॉम/प्रश्न/8924 9 61/निजी-जैसी-गुण-इन-मॉडलों-या-विचार-ऑफ-बैकबोन-जेएस –

उत्तर

11

यह सब लपेटें ऊपर एक आत्म लागू गुमनाम समारोह में:

(function() { 
    var myPrivate = 1; 

    myView = Backbone.View.extend({ 
     initialize: function(options){ 
      this.myPublic = "I'm public"; 
      myPrivate++; 
     }, 
     render: function() { 
      alert(myPrivate); 
     } 
    }); 

})(); 

संपादित करें: के रूप में नीचे kaustubh's comment में बताया, ऊपर के उदाहरण के लिए एक निजी चर कि उदाहरणों के बीच साझा किया जाता है। आप संरक्षित वैरिएबल का एक प्रकार बना सकते हैं, यानी एक आवृत्ति स्तर चर जो दृश्य के अन्य उदाहरणों द्वारा पढ़ा जा सकता है। प्रत्येक उदाहरण को "निजी स्थैतिक" चर में एक अद्वितीय सार्वजनिक आईडी और स्टोर आवृत्ति चर दें।

(function() { 
    var data = []; 

    myView = Backbone.View.extend({ 
     initialize: function(options){ 
      this.myPublic = "I'm public"; 
      this.Id = data.length; 
      data.push({}); 
      data[this.Id].myProtected = "abc"; 
     }, 
     render: function() { 
      alert(data[this.Id].myProtected) 
     } 
    }); 
})(); 

या, आप एक सार्वजनिक आईडी का उपयोग किए बिना यह कर सकते हैं, लेकिन इसे और अधिक जटिल एक सा हो जाता है:: तब आवृत्ति आईडी से चर का उपयोग

(function() { 
    var data = (function() { 
     var dataValues = []; 
     return function (instance) { 
      for (var i = 0; i < dataValues.length; i++) { 
       if (dataValues[i].instance === instance) { 
        return dataValues[i].data; 
       } 
      } 
      var dataObject = { instance: instance, data: {} }; 
      dataValues.push(dataObject); 
      return dataObject.data; 
     }; 
    })(); 

    myView = Backbone.View.extend({ 
     initialize: function(options){ 
      this.myPublic = "I'm public"; 
      data(this).myProtected = "abc"; 
     }, 
     render: function() { 
      alert(data(this).myProtected) 
     } 
    }); 
})(); 

मैं के साथ आने के लिए संघर्ष कर रहा हूँ वास्तव में निजी चर भंडारण का एक तरीका है। प्रेरणा हमले अगर मैं वापस पोस्ट करूंगा।

+0

अंत में इसे स्वयं-आक्रमण करने के अंत में ब्रैकेट को न भूलें। – Gazler

+0

@ गैज़लर - अच्छा पकड़, धन्यवाद! – gilly3

+0

धन्यवाद गैज़लर, आप इस दृश्य का उदाहरण कैसे बनायेंगे। या आप – Chapsterj

19

मेरा सुझाव है कि आप प्रारंभिक विधि का उपयोग अन्य सभी तरीकों के आस-पास बंद होने के रूप में करें। मुझे लगता है कि यह आपको क्लासिकल विरासत भाषाओं जैसे सी ++ और जावा में प्राप्त होने के साथ अधिक संगत व्यवहार देगा:

 

myView = Backbone.View.extend({ 

    initialize: function(options){ 
    var myPrivate = "I'm private"; 

    this.myPublic = "I'm public"; 

    this.getPrivate = function() { 
     return myPrivate; 
    }; 

    this.setPrivate = function (value) { 
     if (typeof(value) === 'string') { 
      myPrivate = value; 
      return true; 
     } else { 
      return false; 
     } 
    }; 
    } 
}); 
+0

प्रारंभिक अंदर विधियों को जोड़ना जो निजी चर का उपयोग करता है, हर बार ऑब्जेक्ट बनाया गया धीमा प्रारंभ करें? –

+1

@StalinGino हां। मुझे नहीं पता कि यह मंदी है कि क्या कोई भी महसूस करेगा, लेकिन यह निश्चित रूप से स्मृति में अधिक जगह पर कब्जा करेगा। – pilau

-2

"इस" का उपयोग करना?

 

    initialize:function() { 
     this.viewpointers = {} 
    }, 
    render:function() { 
     var self = this 
     _.each(this.viewpointers, function(item){ 
      self.$el.find(".assigned-items").append(item.render().el) 
     }); 
    } 

उन्हें जोड़ना। फिर ये कम से कम संरक्षित हैं। हालांकि यह तकनीकी रूप से नहीं बना रहा है/एक निजी चर का उपयोग कर, क्योंकि एक ही बंद के अन्य उदाहरण यह के लिए उपयोग होगा

 

    this.viewpointers[model.id] = new view({model:model}) 

0

gilly3 के समाधान, सर्वश्रेष्ठ उत्तर हो सकता है (आप शायद के अन्य सदस्यों के बारे में के रूप में चिंतित नहीं हैं अपने विकास टीम उस विशेषाधिकार का दुरुपयोग कर रही है, लेकिन ऐसा हो सकता है)।

आप gilly3 के दृष्टिकोण का उपयोग कर के बिना निजी चर का उपयोग करना चाहते हैं, के पास Privman का जवाब ही सच्चा समाधान हो गया लगता है के रूप में डगलस Crockford बताते हैं यहां निजी चर बनाने का तरीका: http://javascript.crockford.com/private.html

इस के बाद से अतिरिक्त जावास्क्रिप्ट प्रसंस्करण समय जोड़ देगा यह प्रोटोटाइप विरासत का उपयोग करने में सक्षम नहीं होगा और हर बार समारोह को फिर से बनाने के लिए संसाधनों का उपयोग करेगा।

हालांकि, यह एक बहुत ही उल्लेखनीय मुद्दा नहीं हो सकता है यदि आप हर बार बंद होने पर बंद हो जाते हैं या यदि कोई नया उदाहरण बनाया गया है तो न्यूनतम है। दोनों दुनिया के सर्वश्रेष्ठ प्रयास करने और प्रयास करने के प्रयास में, आप अपनी चरम सीमा का प्रतिनिधित्व कर सकते हैं जो निजी चर (via delegation pattern) का उपयोग एक स्थिर कार्य में करता है जो हर बार फिर से नहीं बनाया जाएगा। यह आपकी publicMethodThatUsesPrivateVariable विधि को नीचे दिखाए गए विधि को छोड़ देगा, जिसका अर्थ है कि इसे हर बार फिर से बनाने में कम समय लगना चाहिए।

var _privateStaticMethod = function(privateVariableValue, methodParameter) { 
     var result; 

     // Execute the lengthy javascript logic here ... 

     result = Math.ceil(privateVariableValue/108); 
     result += 4815162342; 
     return result; 
    }; 

    Backbone.View.extend({ 
     initialize: function() { 
      var _privateVariable = 303; 

      this.publicMethodThatUsesPrivateVariable = function(methodParameter) { 
       // Only place as little logic as you can here outside of the private static method being used below 
       _privateVariable += 1; 

       return _privateStaticMethod(_privateVariable, methodParameter); 
      }; 
     }, 

     // ... 
    }); 

ध्यान दें कि कोड के ऊपर के साथ-साथ समारोह के कुछ प्रकार में लिपटे किया जाना चाहिए ताकि _privateStaticMethod एक वैश्विक चर/कार्य नहीं है।

1

वस्तु को सीधे विस्तारित फ़ंक्शन में डालने के बजाय, बंद करने के बारे में और उस बंद होने से कैसे ऑब्जेक्ट को विस्तारित फ़ंक्शन पर वापस कर दिया जाता है?

var myView = Backbone.View.extend(function() { 

    var _myPrivateOne = 0; 

    function _myPrivateStrangeSquareFunction(a) { 
    return a * a + 1; 
    } 

    return { 
    initialize: function (options) { 
     _myPrivateOne = options.privateOne; 
     this.myPublicOne = options.publicOne; 
    }, 
    setPrivateOne: function (value) { 
     _myPrivateOne = value; 
     return _myPrivateOne; 
    }, 
    getPrivateOne: function() { 
     return _myPrivateOne; 
    }, 
    getPrivateOneStrangelySquared: function() { 
     return _myPrivateStrangeSquareFunction(_myPrivateOne); 
    } 
    }; 

}()); 

मैंने यह कोशिश नहीं की है, क्योंकि मेरे पास अभी कोई बैकबोन इंस्टॉल उपलब्ध नहीं है।

+0

अब मुझे एहसास है कि इन निजी चर को इस दृश्य के कई उदाहरणों से साझा किया जाएगा। इसके लिए एक फिक्स होगा: _privates = {}; _privates [this.cid] = {}; // विशिष्ट वस्तु (सीआईडी ​​द्वारा) के लिए निजी सामान भंडारण के लिए ऑब्जेक्ट। – jgroenen

0

मुझे "सुपर" विधि को ओवरराइड करने में समस्या होने तक मैं Privman के उत्तर के करीब पसंद कर रहा था। initialize() को बैकबोन ऑब्जेक्ट के निर्माण के माध्यम से किसी भी तरह से नहीं कहा जाता है, ओवरराइडिंग उस समय तक नहीं हो सकता है जब इसे आवश्यकता होती है (यदि इसे initialize() से पहले जाना जाता है)।

विशेष रूप से, यह parse() के साथ एक समस्या हो सकती है।

MyModel = Backbone.Model.extend({ 
    initialize: function (options) { 
     this.parse = function (response, xhr) { 
      // parsing logic 
     }; 

     // public & private vars/methods here 
     // and also initialize code 
    } 
}); 

MySubModel = MyModel.extend({ 
    initialize: function (options) { 
     this.parse = function (response, xhr) { 
      // override MyModel with my own parsing logic 
     } 

     // public & private vars/methods here 
     // and initialize code here 
    } 
}); 

MySubModel.parse() कहा जा कभी नहीं होगा: (। दृश्य के लिए नहीं एक मुद्दा है, लेकिन निश्चित रूप से संग्रह और मॉडल के लिए) इस स्थापना को देखते हुए।

इसके बजाय, मैंने पाया कि एक IIFE का उपयोग कर इनिशियलाइज़ के बजाय() दोनों इस समस्या को साफ करता है और एक समारोह पहले से ही एक निर्दिष्ट उद्देश्य (initialize()) है कि बनाने की तुलना में क्लीनर पढ़ता बाकी को परिभाषित करने के लिए एक बंद रूप में दोहरा काम करना कक्षा का

var MyModel = {}; 
(function() { 
    this.initialize = function (attributes, options) { 
     // initialize me 
    } 

    this.parse = function (response, xhr) { 
     // override at will 
    } 

    // other public & private vars/methods here 
}).call(MyModel); 

Backbone.Model.extend(MyModel); 

दुर्भाग्य से, यह "निजी" चर वर्ग के सभी उदाहरणों भर में साझा किया जा रहा के रूप में दोनों gilly3 और पास Privman के जवाब कर के साथ एक ही समस्या है। निजी चर संभव बनाने के लिए एक अजीब तरीका सुनना अच्छा लगेगा, लेकिन शायद मुझे इसे अवश्य देना चाहिए और पहचानना चाहिए कि मैं अब जावास्क्रिप्ट लिख रहा हूं, जावा/एएस 3/सी ++ नहीं।

0

आप इस कोशिश कर सकते हैं:

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

      this.getValue = function() 
      { 
       console.log(_value); 
      }; 
      this.setValue = function (value) 
      { 
       _value = value; 
      }; 
     } 
    }); 
0

"निजी" चर जोड़ के मानक बैकबोन तरह से उनके सामने एक अंडरस्कोर से विशेषताओं के रूप में उन्हें घोषित करने के लिए "_" है। वे वास्तव में निजी नहीं हैं, लेकिन डेवलपर्स को एहसास होगा कि वे सार्वजनिक रूप से उपयोग नहीं किए जाने वाले हैं।

वास्तव में, यह है कि बैकबोन अपने निजी चर कैसे संग्रहीत करता है।

0

बैकबोन के साथ Broserify.js का उपयोग कर के संदर्भ में (और वास्तव में मध्यम परियोजना के ऊपर किसी भी) मैं निम्नलिखित तरीके से निजी वार्स और कार्यों है पाया:

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); 
    }, 
}); 
संबंधित मुद्दे