2014-02-03 4 views
3

Учусь AngularJS, И сегодня я бегу в странном случае, так это код: PlunkerAngularjs, Директива, амперсанд

И есть некоторые вещи, которые я просто не могу объяснить:

  1. Если вы посмотрите на значения console.log(scope.done) из ссылки Plunker выше может, это значение function (a){return l(e,a)} это значение выглядит сжатого функция версия, После того как я играл с кодом немного я обнаружил, что выше функция возврата (d я принимаю) выражение вызова logChore(chore) мы переходим в завершенный атрибут done="logChore(chore)", поэтому, выполнив function (a){return l(e,a)}, мы выполняем функцию logChore(chore)?
  2. Другое дело, почему использование объекта картыdone({chore:chore}), я понимаю, что муторно значение свойства будет вставить в параметр с тем же именем logChore(chore), но почему я не могу просто сделать это: done(chore).

Хорошо, если кто-то может помочь мне понять все это, я буду очень благодарен, спасибо всем и у вас хороший день.

ответ

7

Изучаю AngularJS, И сегодня я сталкиваюсь с странным футляром.

Я не понимаю, почему это странно, это как работает angular.js, и это здорово!

это значение выглядит сжатого функция версия ...

Вы правы, если я бегу Console.log(scope.done) с не уменьшенная кода я получаю:

function (locals) { 
    return parentGet(scope, locals); 
} 

Это просто обратный вызов от compile.js source code:

case '&': 
    parentGet = $parse(attrs[attrName]); 
    isolateScope[scopeName] = function(locals) { 
    return parentGet(scope, locals); 
    }; 

Как вы можете видеть, при использовании scope: { done : "&"} угловое выражение анализирует выражение внутри атрибута с помощью $parse и возвращает функцию, которая при запуске будет оцениваться в отношении родительской области.

Вы должны понимать, что это выражение: done="logChore(chore)" в конечном итоге будет работать против внешней области видимости, но внешняя область может не иметь свойства chore.

Хорошим примером являются такие директивы, как ng-click="do($event)", внешний вид не имеет свойства $event, так откуда он исходит?

Angular решает эту проблему, предоставляя объект locals в качестве второго аргумента, который позволяет выполнять выражение в расширенной области.

почему я не могу просто сделать: сделать (тяжкий)?

Причина в том, что угловой не относится к атрибуту с & как функция, он рассматривает его как выражение. На самом деле, вы можете поместить любое выражение внутри этого атрибута, примеры:

  • done = "logChore(chore); x = 1"
  • done = "logChore(otherVar, chore)"
  • done = "isLogged || logChore(chore)"
  • done = "logChore(chore + 1)"

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

Что вы делаете, это объект locals, который расширяет область действия, в которой будет оцениваться выражение.

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