2012-09-26 5 views
25

मेरे पास मेरे दृश्य में ul सूचियों का एक गुच्छा है जो एक jQuery यूआई का उपयोग कर रहे हैं: क्रमबद्ध निर्देशों को खींचने और ड्रॉप करने और सूची आइटमों को पुन: व्यवस्थित करने के लिए सॉर्ट करने योग्य निर्देश।Angular.js: मौजूदा स्कोप डेटा के आधार पर एनजी-दोहराना दोबारा प्रस्तुत करना संभव है?

परिवर्तन मैं jQuery यूआई के ड्रैग के माध्यम से बनाने के लिए और छोड़ रहा $apply समारोह का उपयोग कर $scope पर लागू होते हैं, इस हिस्से में काम करता है ...

मुद्दा अब मैं फिर भी में चल रहा है कि इन सूचियों मैं प्रदान से कुछ में ड्रॉप पर एक कस्टम रूप जिसे उपयोगकर्ता को भरने की आवश्यकता है।

उपयोगकर्ता करने का विकल्प है:

  1. फॉर्म भरें और जारी रखने के लिए तो को $apply कॉल $scope
  2. में डेटा बनी रहती है जो एक जो बजाय $apply बुलाने की बटन रद्द करें क्लिक करें जानकारी संग्रहीत करने के लिए, इस चरण में $scope में मौजूद डेटा को प्रतिबिंबित करने के लिए पिछली ड्रैग/ड्रॉप इंटरैक्शन को प्रभावी रूप से 'मेरी प्रतिपादन' को वापस लेना चाहिए (क्योंकि नवीनतम ड्रैग पर इसका कोई प्रभाव नहीं पड़ा था)।

इस "रद्द करें" बटन का प्रभाव उपयोगकर्ता को सूची आइटम उठाए जाने से पहले और इसे किसी अन्य सूची में खींचने से पहले सबकुछ वापस कर रहा है।

मैं अपने ng-repeat एस के 'रीफ्रेश' या 'पुनः प्रस्तुत' को कैसे बल दूं ताकि वे दृष्टि से रीफ्रेश करें और वर्तमान $scope डेटा फिर से दिखाएं?

+3

आम तौर पर, केवल कोणीय जेएस के अंदर किए गए डेटा मॉडल ($ स्कोप) को बदलना काम करेगा। यदि बाहर किया जाता है, तो $ scope को कॉल करें। $ लागू करें() को अपडेट/रीफ्रेश करना चाहिए। अपने रद्द करने वाले मैनिप्ल्यूशंस के अंत में, क्या आप $ स्कोप कॉल कर रहे हैं। $ $ (।), या अपने स्कोप को $ स्कोप में लपेटें। $ आवेदन करें (फ़ंक्शन() {... यहां परिवर्तन ...})? –

+0

मैं वास्तव में jQuery आधारित निर्देश के अंदर से '$ scope.apply() 'को कॉल कर रहा हूं लेकिन यह मौजूदा डेटा के पुनः लोड/पुनः प्रस्तुत करने के लिए प्रतीत नहीं होता है। शायद क्योंकि कोणीय सोचता है कि सब कुछ ठीक वही है, मुझे इसके बारे में बताने के बिना डोम मैनिपुलेशन करने के बारे में नहीं जानते। तो मुझे वास्तव में एक 'फोर्स रीफ्रेश' कॉल की आवश्यकता है, जहां एंगुलर '$ स्कोप' राज्य के बावजूद सिर्फ अपने प्रस्तुत डेटा के ताज़ा करने को मजबूर करता है। – Jannis

+0

ठीक है, एक संभावित कामकाज के रूप में, यदि आप ड्रैग किए गए आइटम को $ कॉल से $ दायरे में $ scope से हटाते हैं। $ लागू करें() - कोणीय को देखना चाहिए और फिर से प्रस्तुत करना चाहिए - फिर अगली पंक्ति पर (अभी भी आपके $ दायरे के अंदर $ $() कॉल लागू करें) $ timeout() का उपयोग करके इसे दोबारा जोड़ें: '$ timeout (function() {... हटाए गए आइटम को वापस $ स्कोप में जोड़ें ...}); '$ स्कोप मैनिपुलेशन जो आप करते हैं $ टाइमआउट फ़ंक्शन को दूसरी बार होने का कारण बनना चाहिए। –

उत्तर

22

उपयोगकर्ता फ़ॉर्म को भर कर शुरू होता है, मैं

$scope.oldData = angular.copy($scope.data);

तब प्रपत्र का उपयोग कर के रूप में वह पसंद करती है उपयोगकर्ता संपादित $ scope.data जाने स्थापित करेगा।

फिर यदि उपयोगकर्ता रद्द करता है, तो बस $scope.data = $scope.oldData सेट करें।

+0

मैंने इस तरह से उपयोग किया, लेकिन मुझे दो बार आवेदन करने की आवश्यकता है; scope.oldData = angular.copy (scope.irs); scope.irs.length = 0; गुंजाइश। $ आवेदन(); scope.irs = scope.oldData; गुंजाइश।$ लागू(); –

+0

यह एक अच्छा समाधान है। इससे मुझे एनजी-दोहराव की पुन: प्रतिपादन करने में मदद मिली जहां डेटा स्वयं नहीं बदला गया था लेकिन उसे मजबूती से पुनः प्रस्तुत किया जाना था। मैंने केवल $ scope.data किया [0] = angular.copy ($ scope.data [0]); पूरे सरणी की प्रतिलिपि बनाने के बजाय। यह जानना अच्छा होगा कि इस पुन: प्रस्तुत करने वाली सामग्री के लिए एक कोणीय कार्य है या नहीं; –

+2

डिफॉल्ट रूप से, कोणीय ट्रैक करेगा अगर दोहराना में प्रत्येक ऑब्जेक्ट पर '$$ हैशकी' चर डालकर एक ng-repeat तत्व को फिर से प्रस्तुत किया जाना चाहिए। यदि इंडेक्स में से एक पर '$$ हैशकी' परिवर्तन होता है, तो यह फिर से प्रस्तुत करता है। एक हैशकी सरणी में चलने वाले तत्व के माध्यम से बदल सकता है, हटाया जा रहा है, या एक नया जोड़ा जा रहा है। आप कोणीय को बता सकते हैं कि किस संपत्ति को ट्रैक करना है यह देखने के लिए कि क्या आइटम को 'ng-repeat = "आइटम द्वारा आइटम्स.आईडी द्वारा ट्रैक किए गए आइटमों में फिर से प्रस्तुत करना चाहिए या नहीं," या फिर - अगर किसी आइटम पर' item.id' परिवर्तन होता है, यह फिर से प्रस्तुत करेगा। –

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