2015-11-18 3 views
0

В приложении AngularJS внутри функции, которая снова находится внутри контроллера, , что будет лучшим подходом при создании переменной.Angularjs: Controller Функция: переменные: «var» или контроллеры propetsies

  • обычно создает с var ключевым словом

    function getAnswer() { 
         //Some code here 
         var persistedDateValue = templateFactory.getAnswer(ctrl.item.ItemId); 
         //Some other code here 
         return persistedDateValue; 
        } 
    
  • добавить его в области контроллера

    function getDateAnswer() { 
        //Some code here 
        ctrl.persistedDateValue = templateFactory.getAnswer(ctrl.item.ItemId); 
        //Some other code here 
        return ctrl.persistedDateValue; 
    } 
    

Здесь ctrl является контроллером, как и в директиве controllerAs: 'ctrl',.

Мое преуменьшение в том, что вариант один лучше, поскольку нам не нужна эта переменная, кроме этой функции.

Просьба предложить.

+0

Вы должны быть привязаны к 'this' в контроллере –

+0

Это зависит от того, нужно ли вам его протестировать или нет. Если он является частным, просто создайте переменную, если вам нужен внешний доступ, сделайте это свойство контроллера. – Lee

+0

@SimonH, если я правильно вас понимаю, у меня это внутри моего контроллера: 'var ctrl = this'; – Posto

ответ

0

Javascript очень разрешительный. Если вы использовали более строгий язык как C или любой из его вариантов, вы не могли бы сделать то, что вы раскрываете во втором варианте. Этот способ доступа к переменным из внешней области (из-за пределов функции) называется «закрытием» и может быть полезен в некоторых ситуациях, но, конечно же, не в том, что вы показываете, это только испортит ваш код, поскольку сама функция может возвращать это результаты, это результат stament в «нормальном» моды, сохраняя один из самых важных принципов программирования науки: разделение интересов (SoC для друзей)

Так придерживаться вариант 1

+0

С опцией # 1 будет ли она создавать новую переменную каждый раз, когда вызов переходит в getDateAnswer() и не уничтожает ее. Если мы используем область контроллера, она будет повторно использовать одну и ту же память. – Posto

+0

Память, используемая переменной, должна быть отмечена как освобождаемая, как только вызов функции завершен, чтобы вы не волновали вас. Но, если эти переменные очень большие, и функция называется много раз в цикле или около того, и вы обеспокоены микро-оптимизацией, тогда было бы разумно использовать закрытие здесь. Оба варианта могут быть правильными, вам нужно торговать между производительностью и ясностью кода, в зависимости от того, что имеет смысл в контексте вашей программы. – Vi100

1

Лучшей практикой будет вариант 1, если, как вы сказали, вы не собираетесь использовать эту переменную в другом месте. Таким образом, вы избегаете использования неиспользуемых данных в своей области.

2

Я согласен с ответом ZSnake, но если вам нужно сделать эту переменную доступной в остальной части вашего контроллера на экране, тогда вам понадобится

.controler('ControllerName', function() { 
    var _this = this; 

    function getDateAnswer() { 
    //Some code here 
    _this.persistedDateValue = templateFactory.getAnswer(ctrl.item.ItemId); 
    } 
+0

С опцией # 1 будет ли она создавать новую переменную каждый раз, когда вызов переходит в getDateAnswer() и не уничтожает ее. Если мы используем область контроллера, она будет повторно использовать одну и ту же память. – Posto

+0

Нет, это приведет к мутации '_this.persistedDataValue', который является единственным значением в самом контроллере –

+0

Извините, я делаю длинное обсуждение; но 'var persistedDateValue' создает новую переменную каждый раз, не так ли?рассматривая шаг между созданием новой переменной и переменной mutate, что более предпочтительно с учетом производительности. – Posto

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