2014-01-11 3 views
14

Я новичок в AngularJS и я вижу этот синтаксис много:Angularjs пользовательских фильтров и зависимостей

function someFunc(){ 
    return function(input){ 
    return 'hello' + input; 
    } 
} 

Функция выше, представляет собой общий синтаксис я склонен видеть много, но проблема специфична в этом примере для пользовательского фильтра:

angular.module('bookFilters', []) 
    .filter('newBookFilter', function(){ 
      return function(input){ 
     return 'The Book: ' + input.name + 'is new !'; 
    }; 
}); 

Я понимаю, что оборачивать функции с другой функцией дает мне возможность использовать инъекции зависимостей, Вот мои вопросы по этому поводу:

ли фильтр возвращает функцию, возвращаемую из функции обертки? Тогда можно ли использовать инъекцию зависимостей для ввода значения в функцию? Теоретически, что:

Этот код:

{{bookObj | newBookFilter}} 

Станет:

{{ bookObj | function(input){return 'The Book: ' + input.name + 'is new !'; } }} 

И, наконец, {{}} возвращает конечное значение из функции.

Почему я не могу просто вводить input к первой функции, как:

angular.module('bookFilters', []) 
     .filter('newBookFilter', function(input){ 
      return 'The Book: ' + input.name + 'is new !'; 
    }); 

Почему инъекции зависимость будет работать только на возвращаемой функции?

Я знаю, что я действительно смущен здесь. Если кто-нибудь может мне помочь, я буду очень благодарен, спасибо всем и у вас хороший день.

+0

мы используем ту же функцию (.фильтр) с теми же параметрами => должна быть только одна реализация. Как угловой каркас может различаться между вашим первым случаем и вашим вторым случаем? –

+0

Если бы было что-то подобное, было бы две разные функции, похожие на то, что у нас есть '.factory' и' .service' –

+0

Можете ли вы помочь мне понять, почему angularjs требуют 2 функции для использования инъекции зависимостей? –

ответ

11

Я думаю угловой завод, обслуживание, фильтр, директива оберток как печи, которые создают объекты JavaScript и функцию с угловыми вкусами. Таким образом, чтобы занимать один и тот же стиль от ответа Василий в:

// Don't use this code in a real app. It's just to illustrate a point. 
angular.module('App', []) 

// The following oven makes an Angular flavored JavaScript function that 
// formats a currency 
.service('currencyBadFilterFn', 
    // We inject a built-in Angular filter, currencyFilter, into our oven 
    function(currencyFilter) { 
    // oven produces a function that can be used in other places in Angular code 
    return function(number) { 
     // produced function returns a currency-formatted number when used 
     return currencyFilter(number) 
    } 
    } 
) 

.controller('MainCtrl', 
    function($scope, currencyBadFilterFn) { 
    $scope.amount = currencyBadFilterFn(10) // $10.00 
    } 
) 

Как вы можете видеть, тот же шаблон используется в создании сервисов. Здесь мы создаем службу, которая возвращает функцию, которую мы можем использовать в других местах нашего кода.

Первая функция, функция духовки, вместе с оберткой .service или .factory или .filter, сообщает Угловой, как построить свою функцию.Возвращаемое значение этой первой функции - это то, что вы будете использовать в своем коде.

+0

Итак, я понимаю, что я могу использовать инъекцию зависимостей только для функции обертки. Вся идея подобна фабрике какие экземпляры используют значение, используемое несколько раз? –

+0

@uBlankText да! Значение, возвращаемое этими обертками, представляет собой синглтон, который можно использовать в других местах вашего кода. –

+0

Итак, причина (помимо преимущества singleton) для использования 2 функций заключается в том, что 1 (функция-обертка) будет принимать зависимости, а возвращаемая функция получит фактические значения. Потому что, как я заметил на примере Василия, я не могу использовать ни один из фактические значения передаются внутри оболочки, но только возвращаемая функция получает значения. –

20

Ответ на ваш вопрос. Угловые впрыскивает только в функции фабрики, но не в результирующей функции:

.filter('newBookFilter', function($log, ...){ // <- factory function 
     return function(input, ...){    // <- resulting function 
     }; 
    }) 

Factory функции имеют произвольные инъекционные параметры. Результирующая функция имеет фиксированные параметры.

Вторая причина заключается в том, что вы можете выполнить некоторую инициализацию в заводской функции. Это полезно, например, при определении new directive. Также закрытие фабрики возвращает, которое может захватывать переменные и аргументы из заводской функции. См. Пример ниже. Он использует инъекцию зависимостей для получения объекта регистрации. Here - полный пример.

.filter('joinBy', function ($log) {  // <- injected here 
    return function (input, delimiter) { // <- used here 
     var res = (input || []).join(delimiter || ','); 
     $log.info(res); 
     return res; 
    }; 
    }); 
+0

Привет, спасибо за ваш ответ, можете ли вы объяснить: «Заводская функция имеет произвольные введенные параметры. Результирующая функция имеет фиксированные параметры». ... –

+0

_I отмечена, какая функция является фабричной и которая получается (см. Первый блок кода) _. Под «произвольными введенными параметрами» я подразумеваю, что угловые передают «необходимые» параметры внутри этой функции. Угловые видят имена аргументов функций, чтобы понять, что функция хочет «съесть» в качестве параметра. –

+0

Под «фиксированными параметрами» я подразумеваю, что угловое значение всегда отправляет один и тот же набор параметров и не видит имена аргументов. Хорошим примером является функция «ссылка» в определении новой директивы. Он всегда имеет 4 параметра _ (последний является необязательным) _. Я не уверен на 100% о результате функции фильтра. Я буду искать документы. –

0

Вот как я это сделал.

myApp.filter("myCustomDateFormatter", ['MyFactoryWithCustomFunctions', function (InjectedCustomFunction) { 
    return function (input) { 
     return InjectedCustomFunction.GetDateFromDotNetJson(input); 
    } 
}]); 
Смежные вопросы