2015-04-16 2 views
3

У меня возникли проблемы с использованием $scope.$watch по некоторым угловым переменным, которые у меня есть в рамках моего проекта. Я привел пример jsfiddle, чтобы проиллюстрировать проблему.ngМодель с ngSwitch, не может смотреть строковые переменные?

В принципе, я могу $scope.$watch любая модель в пределах ng-switch, если это объект. Если это строка, она не будет вызывать выражение часов и не будет изменена за пределами области ng-switch. Угловая копирует исходную строку вместо передачи ее по ссылке, например, объект?

Я использую ng-repeat над некоторыми элементами - вот некоторые из моего кода:

<div ng-switch="key"> 

      <div ng-switch-when="deal_id"> 
       DEALID: <input type="text" ng-model="dealIdModel"/> -- {{dealIdModel}} 
      </div> 
      <div ng-switch-when="thing_id"> 
       THING: <input type="text" ng-model="thingIdModel.test"/> -- {{thingIdModel.test}} 
      </div> 
      <div ng-switch-default> 
       DEFAULT: <input type="text" placeholder="email" ng-model="items.params.email"/> -- {{items.params.email}} 
      </div> 

     </div> 

И в JS:

$scope.items = { 
     "statusCode":"ACTIVE", 
     "params":{ 
      "deal_id":"", 
      "thing_id":"", 
      "email":"Change me! I will get called" 
     } 
    }; 

    $scope.dealIdModel = "I won't change outside of the loop or get called."; 
    $scope.thingIdModel = {test:'Change me! So will I!'}; 

    $scope.$watch('items.params.email', function (now, then, scope) { 
     console.log('email change', now, then); 
    }); 

    $scope.$watch('thingIdModel.test', function(now, then, scope) { 
     console.log('changed the thing', now, then); 
    }); 

    $scope.$watch('dealIdModel', function(now, then, scope) { 
     console.log('dealID changed:', now, then); 
    }); 

ответ

3

Это связано с ребенком рамки, создаваемом ng-repeat. Поскольку создается новая область, если вы устанавливаете равную переменную в области дочерних объектов, вы меняете ссылку там, но не в родительском. Когда вы используете объект, родитель поддерживает ссылку на объект и изменяется только внутренняя часть.

Это та же проблема, когда вы слышите «всегда поставить точку в вашей нг-модели»

Гораздо более подробная информация здесь: https://github.com/angular/angular.js/wiki/Understanding-Scopes

+0

Это правильный ответ. Всегда используйте $ scope.someObj.someProp вместо всего лишь $ scope.someProp, чтобы избежать затенения переменных во внутренних областях. – tandrewnichols

+0

Я чувствую себя застенчивым ... Я новичок в Angular, и это видео (и рецензия) были великолепны. Полезно знать, что «всегда ставить точку в вашей ng-модели». –

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