2013-02-05 14 views
7

मैं सर्वर से वेबशॉट पुश के बाद अपना कोणीय मॉडल बदलने की कोशिश कर रहा हूं। प्रत्येक बार जब सर्वर नए डेटा परोसता है तो $scope.contacts जैसे मानों को बदलना संभव है ..?सर्वर से वेबसाईट डेटा धक्का के बाद Angularjs मॉडल परिवर्तन

मुझे यकीन नहीं है कि $apply का उपयोग करके यह संभव है। मुझे पता है कि मैं डोम तत्व को दायरे को पुनः प्राप्त कर सकता हूं और फिर मानों को बदल सकता हूं, लेकिन एक बेहतर समाधान होना चाहिए!

मैं कोणीय मॉड्यूल बनाने के बिना बाहर से कोणीय मॉडल को अद्यतन करने के लिए एक समाधान में वास्तव में रूचि रखता हूं क्योंकि मैं सापेक्ष डेटा स्रोतों का उपयोग कर रहा हूं जो परिवर्तन घटनाओं को उत्सर्जित करते हैं।

function MyController($scope) { 
    $scope.contacts = []; 
} 

datasource changed -> function() { 
    MyController.set('contacts', 'value'); // change angular scope property 
} 
+2

हाँ $ –

+0

@ जिम्बो लागू करने के साथ यह संभव है आपका उत्तर वही है जो मैंने पहले ही अपने प्रश्न में वर्णित किया था। मैं एक आसान तरीका खोज रहा हूं, लेकिन मुझे लगता है कि मेरा खुद का कारखाना मॉड्यूल लिखना सबसे अच्छा समाधान है। –

उत्तर

10

देखो:

angular.module('app') 
    .factory('socket', ['$rootScope', function ($rootScope) { 

    var socket = io.connect(); 

    return { 
     on: function (eventName, callback) { 
     socket.on(eventName, function() { 
      var args = arguments; 
      $rootScope.$apply(function() { 
      callback.apply(socket, args); 
      }); 
     }); 
     }, 
     emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function() { 
      var args = arguments; 
      $rootScope.$apply(function() { 
      if (callback) { 
       callback.apply(socket, args); 
      } 
      }); 
     }) 
     } 
    }; 

    }]); 

और इसे का उपयोग नियंत्रक:

angular.module('app') 
    .controller('Controller', ['$scope', 'socket', function ($scope, socket) { 

    socket.emit('register') 

    socket.on('register', function (data) { 
     $scope.data = data; 
    }); 

}]); 
+0

यह वास्तव में एक अच्छा उदाहरण है लेकिन यह मेरे मामले में काम नहीं करेगा, क्योंकि मैं क्लाइंट पर संग्रह के साथ डेटा सिंक्रनाइज़ कर रहा हूं और ये संग्रह परिवर्तन घटनाओं को छोड़ देते हैं। मैं आपके सुझाव के साथ काम करने के लिए कोड में बदल सकता हूं, लेकिन जो मैं वास्तव में करना चाहता हूं वह है 'scope.contacts = db.collection (' contact ')। ढूंढें (' पसंदीदा ');' और कोणीय मॉडल प्रॉपर्टी को सेट करें समय मेरा संग्रह अपडेट किया गया है और फिर इस कोड को कॉल करें। –

+0

आप किस डीबी क्लाइंट पर उपयोग कर रहे हैं? क्या '()' कॉलबैक फ़ंक्शन है? क्या आप ग्राहक का पूरा स्रोत दिखा सकते हैं? –

2

सिर्फ

नीचे
socket.onmessage = function (event) { 
    scope.$apply(function(){ 
     // modify scope values here 
    } 
    }; 
है जैसे कि यह कार्य करें:

var book = new Backbone.Model({ title: 'value' }); 
book.set("title", "A Scandal in Bohemia"); 

क्या मैं AngularJS में चाहते हैं कुछ की तरह है: वहाँ तुम कहाँ कह सकते हैं कि ऐसा करने के लिए Backbone.js में की तरह कोई आसान तरीका है socket.io कोणीय सेवा में

+0

अगर मैं गलत हूं तो मुझे सही करें लेकिन जब मैंने अपना दायरा पुनर्प्राप्त किया है तो मैं केवल 'scope.variable =' value'' द्वारा मानों को बदल सकता हूं। मेरा सवाल यह है कि मैं जिस दायरे को सरल तरीके से बदलना चाहता हूं उसे पुनर्प्राप्त करने के बारे में है। –

+0

क्या आपने वेबस्केट अनुरोध –

+0

+1 बनाने के लिए एक कोणीय सेवा बनाई है +1 महान खोज @Ajaybeniwal - मैंने आपके कोड को अपने स्वयं के जेएस के भीतर किसी तत्व के दायरे को पुनः प्राप्त करने की क्षमता के साथ संयुक्त किया है और इसे नीचे एक नए उत्तर में रखा है :) – Jimbo

1

ठीक है, उल्लेखनीय जवाब निश्चित रूप से एक "आसान तरीका" के रूप में ओ पी द्वारा अनुरोध नहीं है। यहां एक बहुत आसान समाधान है।

गुंजाइश भी आप अपने खुद के जावा स्क्रिप्ट कोड में चाहते प्राप्त करें:

var scope = angular.element($("#elementID")).scope(); 

बदलें अपने कोणीय $scope वेरिएबल में मान, लेकिन अपने बाह्य JavaScript से:

scope.$apply(function() { 
    scope.yourArrayForExample.push({name: 'New, external value'}); 
}); 

यहाँ एक JSFiddle है।

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