2014-09-08 3 views
0

. J'ai besoin d'un observateur ou d'un événement qui sera déclenché lorsqu'une propriété sur le modèle (Détails), qui est conservée dans une liste (produits), change.Événement de changement de propriété AngularJS/écouteur sur la liste <model>

Vue:

<tr class="data-row" data-ng-repeat="c in c.products"> 
{{c.name}} <-- if c.name changes fire an event 
{{c.expire}} <-- if c.expirechanges fire an event 
{{[...]}} <-- c contains many properties 

ViewModel

c.setDirtyFlag() 
{ 
    c.dirty=true; 
} 

Y at-il une solution à ce problème AngularJS? salutations

@Shomz J'ai essayé la montre avec le code suivant. Mais lorsque la propriété c.expires sera modifiée dans le champ de saisie, la montre ne sera pas levée.

$scope.$watch("c.products.expire", function (newValue, oldValue) { 
     log.debug(newValue); 
    }); 

EDIT: Pour être plus précis: La liste des produits sera généré au cours de l'exécution. L'utilisateur peut également ajouter et supprimer des éléments. Ces objets ajoutés "temporaires" doivent également être surveillés.

+0

Avez-vous essayé [ 'watch' de $] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope) uant des changements? – Shomz

+0

Angular a un attribut 'dirty' sur le formulaire ... voir: https://docs.angularjs.org/api/ng/directive/form –

+0

Définir une propriété comme c.dirty = true; sur la propriété a changé était seulement un exemple. J'ai besoin d'exécuter du code personnalisé quand une propriété est modifiée. – Briefkasten

Répondre

0

Vous pouvez configurer $ watch sur chaque élément de la variable tableau $ scope.products et effectuer la gestion des événements de cette façon.

_.each(products, function(product) { 
    $scope.$watch(function() { return product; }, function(newVal, oldVal) { 
     if(newVal.name != oldVal.name || newVal.expire != oldVal.expire || ...) { 
      //do event work 
      product._isDirty = true; 
     } 
    }); 
}); 

Alternativement, si vous enveloppez ceci sous une forme, vous pouvez vérifier la variable sale $ pour cette forme pour voir le cas échéant.

+0

Merci, je vais essayer ça. Quand j'ajoute un article - un produit je dois l'ajouter aussi à la $ scope. $ Watch? – Briefkasten

+0

@Briefkasten Oui, mais attention. J'ai peut-être mal compris le scénario. Si vous gérez constamment ce tableau, vous ne regarderez pas pour déclarer des montres encore et encore. Qu'est-ce que vous essayez de faire, plus précisément? – wbeange

+0

J'ai modifié mon message et ajouté plus d'informations. – Briefkasten

0

Merci de m'avoir amené dans la bonne direction @wbeange. Ceci est ma solution actuelle. La liste de surveillance de $ n'a pas fonctionné comme je m'attendais donc j'ai utilisé le "vieux" $ watch.

$scope.$watch("c.products", 
       function (newValue, oldValue) { 
        //first initialising of list 
        if (typeof newValue != 'undefined' && c.products.length > 0) { 

         if (newValue != oldValue && oldValue!=null) { 

          for (var i = 0; i < newValue.length; i++) { 
           if (newValue[i].expire!= oldValue[i].expire 
            || newValue[i].otherprop != oldValue[i].otherprop) 
           { 
            //todo 
           } 
          } 

         } 
        } 
       }, 
       true // Object equality (not just reference). 
      ); 
Questions connexes