2015-02-07 6 views
5

मैं थिंग फैक्ट्री को HTTP अनुरोध करने की कोशिश कर रहा हूं और अपने नियंत्रक में प्रतिक्रिया का उपयोग करने में सक्षम हूं।मुझे अपने कारखाने में angular.copy का उपयोग करने की आवश्यकता क्यों है?

  1. मेरे कारखाने में मैं angular.copy(data, arr) क्या करना है। बस arr = data काम नहीं कर रहा है। ऐसा क्यों है? angular.copy() बस ए) arr से सब कुछ हटा देता है और बी) data के माध्यम से पुनरावृत्त करता है और arr पर सामान असाइन करता है। उस और arr = data के बीच एकमात्र अंतर की एक नई प्रति के बजाय arr अंक data पर है। यह बात क्यों होगी? और क्यों मैं क्या समझ से arr = data.slice(0) काम (नहीं है, यह बहुत ज्यादा है एक ही angular.copy) के रूप में?

  2. सबसे अच्छा तरीका है अपने लक्ष्य को पूरा करने के लिए क्या है? (ठीक से कारखाना)

का उपयोग main.html

<div class="container"> 

<div class="page-header"> 
    <h1>Test App</h1> 
</div> 

<ul> 
    <li ng-repeat="thing in things">{{thing.name}}</li> 
</ul> 

</div> 

main.controller.js

'use strict'; 

angular.module('testApp') 
    .factory('Thing', function($http) { 
    var arr = []; 
    return { 
     things: arr, 
     get: function() { 
     $http.get('/api/things').success(function(data) { 
      angular.copy(data, arr); // this works 
      // arr = data; but this doesn't 
      // arr = data.slice(0); and neither does this 

     }); 
     } 
    }; 
    }) 
    .controller('MainCtrl', function ($scope, Thing) { 
    Thing.get(); 
    $scope.things = Thing.things; 
    }); 
+0

कोणीय.copy ऑब्जेक्ट्स या सरणी के लिए काम करता है, क्या डेटा किसी ऑब्जेक्ट से होता है? बीटीडब्ल्यू आपको उछाल का उपयोग करना चाहिए और अपने एनन कार्यों को नामित कार्यों में निकालना चाहिए और फ़ंक्शन का नाम कारखाने और नियंत्रक विधि में पास करना चाहिए। मॉड्यूल के घटकों को समझना बहुत आसान बनाता है। – Robert

+0

'डेटा' ऑब्जेक्ट्स की एक सरणी है। –

+1

यह काम करता है क्योंकि एआर (सरणी) एक संदर्भ है, और आपको स्कोप बाइंडिंग को काम करने के लिए संदर्भ को संरक्षित करने की आवश्यकता है।अन्यथा, आप एक नए संदर्भ के साथ सिर्फ ओवरराइटिंग एआर हैं - जो संदर्भ के मुकाबले पूरी तरह से अलग वस्तु है जो मूल रूप से दायरे से बंधे थे। – pixelbits

उत्तर

7

आपकी समस्या कोणीय से संबंधित नहीं है, लेकिन जावास्क्रिप्ट को।

var arr = [] // arr is a pointer to an empty array 
var things = arr // things is a pointer to the same empty array 
arr = data // now arr points to data, but things still points to the empty array 

आप नीचे दिए गए कोड को चला कर इस बात का अपने आप को समझा सकते हैं:

var a = [1]; 
var b = a; 
a = [2]; 
// Now if you console.log a and b, a === [2] and b === [1] 

लेकिन यदि आप एक वस्तु

var a = { data: 1 } 
var b = a; 
a.data = 2; 
// Now a.data and b.data are the same: 2 
a = { data: 3 }; 
// Here we changed a, not its property, so a and b are not the same anymore 
// a.data === 3 but b.data === 2 

की संपत्ति में हेरफेर आप समझ कई देखते हैं कि, तो अपनी समस्या को हल करने के तरीके, जैसे:

angular.module('testApp') 
    .factory('Thing', function($http) { 
    var obj = {}; 
    return { 
    things: obj, 
    get: function() { 
     $http.get('/api/things').success(function(data) { 
     obj.data = data; 
     }); 
    } 
    }; 
}) 

और आपके एचटीएमएल उपयोग things.data पर।

या आप के बजाय सूचक आप केवल सरणी की सामग्री अद्यतन करने के लिए (ताकि आगमन तब भी उसी सरणी को इंगित करता है) की जरूरत की जगह, एक वस्तु संपत्ति है, लेकिन सीधे सरणी का उपयोग नहीं करना चाहते हैं:

angular.module('testApp') 
    .factory('Thing', function($http) { 
    var arr= []; 
    return { 
    things: arr, 
    get: function() { 
     $http.get('/api/things').success(function(data) { 
     for (var i in data) { 
      arr[i] = data[i]; 
     } 
     }); 
    } 
    }; 
}) 
+0

आह मैं हिंडसाइट में इतनी बेवकूफ महसूस करता हूं। धन्यवाद! –

0

ऐसा इसलिए होता है क्योंकि आप मौजूदा 12 का उपयोग करने के बजाय arr को सरणी के कुछ नए उदाहरण पर सेट करते हैं। यहाँ आप क्या कर रहे हैं करने के लिए एक सादृश्य है:

var foo = function() { 
    this.test = 'hello'; 
    console.log(this.test); 
}; 

foo = function() { 
    this.test = 'other'; 
    console.log(this.test); 
}; 

console.log(foo()); // outputs other 

angular.copy बजाय कुछ इस तरह है:

// foreach item in the source (in this case data) 
arr.push({ 
    my: "value" 
}); 
संबंधित मुद्दे

 संबंधित मुद्दे