Угловая привязка в свойстве объекта

#angularjs #angularjs-scope

#angularjs #angularjs-область видимости

Вопрос:

Как я могу заставить привязку работать для свойств объекта. Например, в моем контроллере у меня есть:

 $scope.reviews = {
  rating_summary: 4,
  items: [ { title: 'A Title'}, etc...  ]
}
  

И, на мой взгляд:

 <li ng-repeat="review in reviews.items">
  

Теперь, всякий раз, когда я изменяю переменные reviews в контроллере, ничего не обновляется:

 $scope.reviews = [new updated reviews]
  

Вероятно, из-за того, что angular прослушивает изменения в старой ссылке $ scope.reviews.

Есть два решения для работы привязки, но оба не очень умные:

  1. Прикрепите элементы непосредственно к области видимости, так было бы $scope.items = $scope.reviews.items , теперь всякий раз, когда элементы изменяются, они будут обновляться.
  2. Пользователь angular.copy для сохранения ссылки на назначение, поэтому angular.copy({items: []}, $scope.reviews);

Существуют ли какие-либо другие решения для достижения этой цели, отличные от приведенных выше.

Комментарии:

1. Это должно работать как #scope.reviews = [] новые обновленные обзоры]… проблема должна быть где-то в другом месте … и не могли бы вы создать plunker для демонстрации…

2. это сработало бы, если бы scope.reviews был массивом, но это объект, а массив является одним из ключей объекта, т.е. $scope.reviews = { rating_summary: 5, items: [ item1, item2, ..] }

3. Проверьте мой пример: jsfiddle.net/or66quta

4. @PoyrazYilmaz извини, чувак, я виноват

Ответ №1:

Это должно сработать, должна быть какая-то ошибка при обновлении объекта / элементов, пожалуйста, обратитесь к этому плунжеру

 $scope.reviews = {
    rating_summary: 4,
    items: [ { title: 'A Title'}, { title: 'B Title'}  ]
  };

  $scope.changeItems = function(){
    $scope.reviews.items = [ { title: 'A Title'}, { title: 'B Title'},
                             { title: 'C Title'}];
  };

  $scope.changeObject = function(){
    $scope.reviews = {
    rating_summary: 4,
    items: [ { title: 'A Title'}, { title: 'B Title'}, { title: 'D Title'}  ]
  };
  

Комментарии:

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