2015-11-02 2 views
1

Привет я строю формы делает много вычислений, таких как обобщение ключей в объектахУгловые расчеты повторить область применения

[ 
    { bar: 5, .. }, 
    { bar: 6, .. }, 
    ... 
] 

Я использую это выражение в в настоящее время 35 мест в моем HTML. Иногда подключен к дальнейших вычислений и с разными ключами

<div> 
    {{ sumKeys('bar') + foobar }} 
</div> 

Функция я использую объявлен как

app.controller('someCtrl', function($scope){ 
    $scope.sumKeys= function(key){ 
     return (calculated sum); 
    } 
} 

Моя проблема в том, что если я пишу одну букву в любом поле ввода функции сумма называется около 400 раз. Я знаю, что существует правило, которое вызывает функцию, если область изменяется до 10 раз, но нет ли более эффективного способа?

Могу ли я выводить результат без изменения области? Или заставить этот расчет сделать только один раз? Я знаю, что результаты не меняют сферу охвата. Таким образом, результаты должны быть одинаковыми после двух итераций. Я также реализовал функцию как фильтр с одинаковыми результатами.

+1

Я бы сделать модель (завод в угловом) и сохраните всю свою логику там для получения необходимых данных. Вы можете выполнить вычисление один раз, вызвав функцию на модели. – ajmajmajma

+0

Что означает @ajmajmajma означает использовать службу/фабрику для создания API, который вы откроете как SINGLETON. Таким образом, все, что вы сделали в этот момент, - это ввести службу/фабрику в w.e. – Yeysides

ответ

1

Что вы ищете, это Сервис SINGLETON. Вы можете сделать один в угловом, как это: (один из моих реальных примеров)

angular.module('ocFileUpload', []) 
     .service('ocFileUpload', ['$http', '$rootScope', function ($http, $rootScope) { 

      // Will house our files 
      this.files = []; 

      // This fn appends files to our array 
      this.addFile = function(files){ 
       for (var i = 0; i < files.length; i++){ 
        this.files.push(files[i]); 
       } 
      }; 

      this.getFileDetails = function(ele){ 
        // push files into an array. 
        for (var i = 0; i < ele.files.length; i++) { 
         this.files.push(ele.files[i]) 
        } 
      }; 

      this.removeFile = function(fileToRemove){ 
       var indexOfFile = this.files.indexOf(fileToRemove); 
       this.files.splice(indexOfFile, 1); 
      }; 

      this.clearFiles = function(){ 
       this.files = []; 
      }; 

      // Return files array 
      this.getFiles = function(){ 
       return this.files; 
      }; 
     }]); 

Тогда просто использовать его в контроллере/директивах:

.controller(['ocFileUpload', function(ocFileUpload){ 
    var ref = ocFileUpload.getFiles(); 
}] 
+0

Привет, спасибо за отличные ответы. Я попробовал его реализовать с сервисом, но это как-то не получилось. – Robin

+1

Ah sorry больше не может редактировать первый комментарий. Я сделал это. Спасибо за вашу помощь! – Robin

Смежные вопросы