2016-09-15 17 views
1

Я новичок в AngularJs, и я использую угловой 1.4. Этот вопрос: Я использую простой объект счетчика, определенный как это:

var myCounter = (function(){ 
        var count =0; 
        return { 
         "inc": function(){ 
          count++; 
         }, 
         "dec": function(){ 
          if(count>0){ 
           count--; 
          } 
         }, 
         "getCount": function(){ 
          return count; 
         } 
        }; 
       })(); 

Я хотел бы, чтобы Граф переменной приватным и считывать значение только через функцию «GetCount».

Всякий раз, когда счет увеличивается/уменьшается, мне приходится выполнять набор операций на основе обновленного значения «count». Для этого я хочу использовать «$ watch» для наблюдения за изменениями. Но я могу получить значение только путем вызова функции getCount().

Просьба предложить мне написать '$ watch' в этом сценарии. Если это неправильный подход, предложите лучший вариант.

Заранее благодарен!

+0

Вы можете сделать '$ сфера. $ Часы (myCounter.getCount, функция() {})' – Satpal

+0

Ok я вроде понимаю, что вы там делаете. Но почему вы не обрабатываете его как объект, а не выполняете его как анонимный объект. Еще одна вещь, которую вы должны учитывать, - это то, что вы хотите сделать. Вы также можете присоединить обратные вызовы к различным функциям, а затем вызвать конкретный код для dec, inc или getCount вместо просмотра всей функции. –

+0

https://jsfiddle.net/satpalsingh/z5k95mwr/ – Satpal

ответ

2

формат для $watch является $watch(watchExpression, listenerFunction). В этом случае watchExpression может быть функцией, которую нужно оценить. Поэтому вы можете передать функцию getCount (а не результат функции) на $watch.

Так,

$scope.$watch(myCounter.getCount, function() {}) 

будет работать, при условии, что myCounter доступна регуляторе $watch определяется.

0

Вы должны выполнить callback всякий раз, когда count увеличивается/уменьшается. Вы можете передать callback конструктору, например:

var myCounter = (function(callback){ 
        var count =0; 
        return { 
         "inc": function(){ 
          callback(++count); 
         }, 
         "dec": function(){ 
          if(count>0){ 
           count--; 
          } 
          callback(count); 
         }, 
         "getCount": function(){ 
          return count; 
         } 
        }; 
       })(); 

или вы можете передать callback на inc или dec событий:

var myCounter = (function(){ 
        var count =0; 
        return { 
         "inc": function(callback){ 
          callback(++count); 
         }, 
         "dec": function(){ 
          if(count>0){ 
           count--; 
          } 
          callback(count); 
         }, 
         "getCount": function(){ 
          return count; 
         } 
        }; 
       })(); 

Разница между этими двумя подходами в том, что в первом вы будет делать то же самое в любом возрастающем/убывающем событии, а во втором вы определяете поведение callback всякий раз, когда такое событие происходит.

+0

Подход обратного вызова также замечательный. Спасибо.! – user3427320

+0

@ пользователь3427320, пожалуйста. –

0

Nice article на $ watch и многие другие! Надеюсь, это поможет вам правильно. В вашем случае вы должны объявлять объекты в области видимости, потому что угловые только просматривают переменные $ scope, поэтому ваш код будет выглядеть ниже.

$scope.myCounter = (function(){ 
       var count =0; 
       return { 
        "inc": function(){ 
         count++; 
        }, 
        "dec": function(){ 
         if(count>0){ 
          count--; 
         } 
        }, 
        "getCount": function(){ 
         return count; 
        } 
       }; 
      })(); 

$scope.$watch('myCounter.getCount', function(newValue, oldValue) { 
    if(newValue != oldValue && newValue !=null){ 
     //call your function.. 
     } 
})