2016-02-16 5 views
2

Я хотел бы понять, как привязки работают в angularJS. Я попытался создать код как можно проще, чтобы показать вам проблему mu. Я знаю, как это использовать, но я не знаю, как это работает.Связывание между контроллером и фабрикой в ​​AngularJS

Вот мой пример. В этом у меня есть 3 области видимости переменных: Plunker

<pre>{{A}}</pre> 
<pre>{{B}}</pre> 
<pre>{{C()}}</pre> 

Они определяются следующим образом:

$scope.A = factory; 
    $scope.B = factory.a; 
    $scope.C = function() { 
    return factory.a.b; 
    }; 

завод под названием "Фабрика" возвращает этот объект:

a: {'b': 'foo'} 

обновления таймаута завод этот путь:

$timeout(function() { 
    factory.a = { 
     'b': 'BOO' 
    } 
    }, 1000); 

Я хотел бы спросить, может ли кто-нибудь дать мне ясный ответ, почему только первый (A) и третий (C) обновляются после таймаута, но не второй.

+2

The B - это коллекция (объект) в Angular. Значения и функции будут обновляться в дайджесте, атрибуты объекта не будут обнаружены во время «грязной» проверки. – ryan0319

ответ

0

Дело B не меняется, потому что $scope.B не меняется.

factory.a = {b: 'foo'}; 
    $scope.B = factory.a; 

    $timeout(function() { 
    factory.a = {'b': 'BOO'}; 
    }, 1000); 

Когда функция $timeout изменяет factory.a, $scope.B все еще указывает на предыдущий объект, {b: 'foo'}.


Case A изменения, поскольку содержание из $scope.A изменений.

$scope.A = factory; 

Даже если объект ссылка имени factory не изменится, то содержание ссылочных изменений.


Случай C изменения, поскольку возвращаемое значение изменения функции.

$scope.C = function() { 
    return factory.a.b; 
    }; 

Каждый переваривать цикл, структура AngularJS оценивает функцию и обновляет DOM с любым изменением.

+0

«Когда функция $ timeout меняет factory.a, $ scope.B все еще указывает на предыдущий объект, {b: 'foo'}." - но почему? – Przemek

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