Kalıcı bir model (sunucu veritabanı) harici bir uygulama tarafından değiştirilirse, AngularJS bir görünümü otomatik güncelleyebilir mi?


81

AngularJS ile yeni tanışmaya başladım, ancak sunucu tarafı veritabanında bir şey değiştiğinde kullanıcı için gerçek zamanlı olarak otomatik olarak güncellenen (yenileme yok) bir görünüme sahip bir web uygulaması oluşturmak istiyorum.

AngularJS bunu (çoğunlukla) benim için otomatik olarak halledebilir mi? Ve eğer öyleyse, işyerindeki temel mekanizma nedir?

Örneğin, AngularJS'yi "model" değişiklikleri için düzenli olarak DB'yi yoklaması için ayarlıyor musunuz? Veya modelin değiştiğini AngularJS istemci tarafına bildirmek için bir tür Comet benzeri mekanizma kullanın?

Benim uygulamamdaki zorluk, diğer (web olmayan) sunucu tarafı yazılımların zaman zaman veritabanını güncelliyor olmasıdır. Ancak bu soru, AngularJS web istemcileri aracılığıyla veritabanını değiştiren birden fazla istemciye sahip olabileceğiniz saf web uygulamaları için de geçerlidir ve bunlardan biri DB'de (model) bir değişiklik yaptığında bunların her birinin güncellenmesi gerekir.


O zamandan beri Meteor'un tüm bunları sizin için çerçevede yaptığını keşfettiğimi eklemek isterim, bu yüzden şimdilik tercih ettiğim çözüm bu. Gelecekte Angular'ı tekrar kontrol edebilirsin.
jpeskin

Meteor hala çok "taze" olabilir - etrafta oynamak iyidir, ancak büyük üretimde kendini kanıtlamamıştır (güvenli / ölçeklenebilirlik / performans / vb.). Bir ay önce kimlik doğrulama eklendi. İyi görünüyor ama bekleyecek.
Alex Okrushko

@jpeskin Merhaba. Bu soruyu sorduğunuzda tam olarak neredeydiniz? En sonunda ne yapmaya karar verdin? (Angular'ı kullanmak istiyorum). Saygılarımızla Mark
mark1234

Yanıtlar:


97

Birkaç seçeneğiniz var ...

  1. Sen kullanarak her X milisaniye yoklama yapabileceğini $timeoutve $http, veya kullandığınız veri REST hizmetine bağımlısı ise şunu kullanabilirsiniz $resourceyerine $http.

  2. Bazı Websocket uygulamalarını kullanan scope.$applyve soket tarafından gönderilen değişiklikleri işlemek için kullanan bir hizmet oluşturabilirsiniz . Aşağıda, bir node.js websocket kitaplığı olan socket.io'nun kullanıldığı bir örnek verilmiştir:

    myApp.factory('Socket', function($rootScope) {
        var socket = io.connect('http://localhost:3000');
    
        //Override socket.on to $apply the changes to angular
        return {
            on: function(eventName, fn) {
                socket.on(eventName, function(data) {
                    $rootScope.$apply(function() {
                        fn(data);
                    });
                });
            },
            emit: socket.emit
        };
    })
    
    function MyCtrl($scope, Socket) {
        Socket.on('content:changed', function(data) {
            $scope.data = data;
        });
        $scope.submitContent = function() {
            socket.emit('content:changed', $scope.data);
        };
    }
    
  3. Gerçekten yüksek teknoloji edinebilir ve bir Angular modeli sunucuyla senkronize eden bir websocket uygulaması oluşturabilirsiniz. İstemci bir şeyi değiştirdiğinde, bu değişiklik otomatik olarak sunucuya gönderilir. Veya sunucu değişirse istemciye gönderilir.
    İşte yine socket.io kullanan eski bir Angular sürümünde buna bir örnek: https://github.com/mhevery/angular-node-socketio

DÜZENLEME : 3 numarada , bunu yapmak için Firebase kullanıyorum .


Birkaç seçenek içeren böylesine kapsamlı bir yanıt için teşekkürler! Angular hakkında daha fazla şey öğrenirken bunu
anlamayı


Çok faydalı, anlaşılması kolay bir cevap için teşekkür ederiz.
mystrdat

Denetleyicinin yok edilmesi gerekiyorsa, olay işleyicilerinin bağlantısını nasıl çözersiniz?
RushPL

Brian ford, $ kapsamın olay sistemi ve temizliği üzerine bindirmenize izin veren harika bir yaklaşıma sahiptir. Ve genel olarak gerçekten temiz olmasını sağlar. github.com/btford/angular-socket-io . Socket.forward () 'a bakın
Andrew Joslin

15

Node yerine jetty kullanan bir uygulama burada. Angularjs bölümü, açısal tohum uygulamasına dayanmaktadır. Açısal kodun deyimsel olup olmadığından emin değilim ... ama bunun çalıştığını test ettim. HTH -Todd.

TimerWebSocketServlet bkz.

https://gist.github.com/3047812

controllers.js

// -------------------------------------------------------------
// TimerCtrl
// -------------------------------------------------------------
function TimerCtrl($scope, CurrentTime) {
    $scope.CurrentTime = CurrentTime;
    $scope.CurrentTime.setOnMessageCB(
        function (m) {
            console.log("message invoked in CurrentTimeCB: " + m);
            console.log(m);
            $scope.$apply(function(){
                $scope.currentTime = m.data;
            })
        });
}
TimerCtrl.$inject = ['$scope', 'CurrentTime'];

services.js

angular.module('TimerService', [], function ($provide) {
    $provide.factory('CurrentTime', function () {
        var onOpenCB, onCloseCB, onMessageCB;
        var location = "ws://localhost:8888/api/timer"
        var ws = new WebSocket(location);
        ws.onopen = function () {
            if(onOpenCB !== undefined)
            {
                onOpenCB();
            }
        };
        ws.onclose = function () {
            if(onCloseCB !== undefined)
            {
                onCloseCB();
            }
        };
        ws.onmessage = function (m) {
            console.log(m);
            onMessageCB(m);
        };

        return{
            setOnOpenCB: function(cb){
               onOpenCB = cb;
            },
            setOnCloseCB: function(cb){
                onCloseCB = cb;
            },
            setOnMessageCB: function(cb){
                onMessageCB = cb;
            }
        };
    })});

web.xml

<servlet>
    <servlet-name>TimerServlet</servlet-name>
    <servlet-class>TimerWebSocketServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>TimerServlet</servlet-name>
    <url-pattern>/api/timer/*</url-pattern>
</servlet-mapping>

Bu harika bir örnek. Sadece Angular.js öğreniyorum ve öğrenmek için şablonlar vb. İçeren eksiksiz uygulamanızın olup olmadığını merak ediyordum.
mac


0

"Meteor'u Keşfedin" kitabına göre, Açısal saatler / dürbünler Meteor'un tepkisellikle ilgili hesaplamalarına benzer ... ancak Angular yalnızca müşteriye özeldir ve Meteor'dan daha az granüler kontrol sağlar.

Benim izlenimim, Angular'ı kullanmak mevcut bir uygulamaya reaktivite eklemek için daha uygun olabilirken, Meteor her şey için kullandığınızda yükseliyor. Ancak henüz Angular ile gerçek bir deneyimim yok (bazı küçük Meteor uygulamaları oluşturmuş olsam da).


0

Andy Joslin, yanıtında benim görüşümdeki en iyi çözümden, web yuvaları veya uğraştığınız diğer eşzamansız kitaplık aracılığıyla durumu çift yönlü olarak korumak olan 3. seçenekten bahsetti (bu, Chrome Uzantıları için Chrome mesaj API'sı ve Örneğin uygulamalar) ve Toddg, bunun nasıl başarılacağına dair bir örnek verdi. Bununla birlikte, örneğinde, AngularJS'de bir anti-model uyguluyor: hizmet, denetleyiciyi çağırıyor. Bunun yerine, model hizmetin içine yerleştirilmeli ve ardından denetleyiciden referans alınmalıdır.

Servis soketi geri aramaları, servis modelini değiştirecek ve kontrolörden referans alındığı için görünümü güncelleyecektir. Yine de yeniden atanabilen ilkel veri türleri veya değişkenlerle uğraşırsanız dikkatli olun, bunların çalışabilmesi için denetleyicide bir izlemeye ihtiyacı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.