2016-03-28 19 views
1

Ben angularJs ile yeni başlayan ve bence, benim $scope benim whatching değişiklikleri ile basit bir sorun var.Otomatik izleme angularJ nasıl etkinleştirilir?

Sunucudan aldığım bir $scope.tasks nesnesine sahibim.

{ 
2: {id: 2, name: 'name1', user: 3}, 
3: {id: 3, name: 'name2', user: 1}, 
4: {id: 4, name: 'name3', user: 4}, 
} 

Ayrıca ben bir işlev görevi güncelleme kullanıcı var: Görünüşe

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).success(function(data, status) { 
     $scope.tasks[taskId].user = userId; //#1 
    }); 
}; 

Ayrıca ben $scope.test(); bu fonksiyon gerekir özel fonksiyon görevlerinde kullanıcının her değişiklikten sonra gerçekleştirilmek zorundadır, güncelleştirme sorgusu ve en güncellenmesi // 1.

sonra örneğin bu amaç $ izlemek için kullanmaya çalıştı ve $ watchCollection:

$scope.$watchCollection('tasks', function() { 
    $scope.test(); 
}) 

Fakat bu yardımcı olmuyor. Ve şimdi $ scope.tasks'imi güncellediğimde her yere $scope.test()'u eklemem gerekiyor. Çok üzücü. Otomatik olarak nasıl yapabilirim?

+1

Saati ne zaman kaydediyorsunuz ve değişiklikleri nasıl tetikliyorsunuz? –

+0

@DavidL Denetleyicimin sonundaki saati kaydediyorum ve seçiminde ng değişimiyle değişimi tetikliyorum. – Neversmile

+0

Bu senin problemin. En başında kaydettirin. Sonunda kayıt olursanız, izleyeceği herhangi bir etkileşim geçene kadar kayıt olmayacağı için makul bir şans vardır. Ve son olarak, bu tasarım kokusunun bir göstergesi olabilir. Bunun yerine geri arama tarzı bir yaklaşım düşünmek isteyebilirsiniz. –

cevap

1

Saatin kullanılması, kodu kullanmak için iyi bir uygulama değildir. update çağrısının başarılı olması durumunda test yöntemine bir çağrı olduğunu söyleyebilirim.

Ve post aramanın bir success callback'inde içine

bir başka çağrı sunucusu verileri ile senkronize düzgün view verileri yapmak tasks listesini güncellenmesini yapmak. Şu anda, birden çok kullanıcı tarafından yaygın olarak kullanılan veri merkezli uygulamada anlamlı olmayan, belirli bir kayıt için istemci tarafındaki verileri güncelliyorsunuz. Bu uygulamaya erişen 1000 kullanıcısına sahip olduğunuzu ve herhangi bir kaydı güncellerken, diğer kullanıcıların da aynı sayfada updated/added kayıt var. Böylece bu uygulama içinde tutarsız davranış katacak. Bu yüzden, uygulamanızın daha tutarlı ve doğru görünmesini sağlamak için & numaralı veriyi almak için bir kez daha ajax yapmanı öneriyorum. Bir daha ajax çağrısı yapmak, 100ms'u almaz, bu da iyi bir sebepten daha az ücret ödenir.

Sen izleyici ile bir yönerge yazmak ve izlenmesini istiyorum modellerde koyabilirsiniz

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).then(function(response) { 
     var data = response.data; 
     $scope.getTasks(); 
     $scope.test(); 
    }); 
}; 

$scope.getTasks = function(){ 
    $http.get('getTasksUrl').then(function(response){ 
     $scope.tasks = response.data; 
    }); 
} 
+0

$ watch kullanarak performans sorunları ve bir tür kötü uygulama yol açabilir biliyorum .. ama neden bir "kötü uygulama" olduğunu? Ben her zaman kötü bir uygulama olduğunu düşünmüyorum –

+0

@PankajParkar Evet, sana katılıyorum. Kodumu şematik ve çok basit gösteriyorum. Sorgu başarılıysa, $ scope.tasks [taskId] .user = userId; Örneğinizde, görevde sadece bir kullanıcıyı değiştirirsem, tüm görevleri tekrar almak istemiyorum. – Neversmile

+0

@ Gonzalo.- haklı olmadığını düşünüyorum çünkü izleyicinin her sindirim döngüsünde bu ifadeyi iyi izleyeceğini biliyorsunuzdur. Bir 'derin' gözlemciye sahip büyük bir toplama nesnesine sahip olduğunuzu varsayalım. uygulama performansınız .. bu yüzden uygulamayı tasarlarken gözetmen kullanımını engellemeye çalışın .. şahsen ben bu yolu tavsiye ederim .. –

0

Kodu. Ancak, sizi doğru anladıysam, başarılı bir istek sonrası sayfanızdaki verileri güncellemeniz gerekiyorsa, bunu başarılı bir gönderiden sonra istek isteğini yerine getirerek, veya daha kötü durum senaryosunda, kullandığınız yönlendiriciye bağlı olarak rota veya eyalet yeniden yüklemesini kullanabilirsiniz. .