Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2015, 15:18
Новичок на форуме
Отправить личное сообщение для YuriT64 Посмотреть профиль Найти все сообщения от YuriT64
 
Регистрация: 25.02.2015
Сообщений: 3

ng-repeat не работает...
При нажатии на кнопку я добавляю элементы в массив и хочу увидеть список в ng-repeat. При первом нажатии все срабатывает замечательно. При втором - я вижу, что размер массива увеличился ({{data.length}}), но список не обновляется. Код программы:

<!doctype html>
<html>
<head>
    <link href="../angular/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <script src="../angular/angular.min.js" type="text/javascript"></script>
    <script src="script.js"></script>
</head>
<body ng-app="test">
    <div ng-controller="ParentCtrl" class="ng-scope" style="background-color: Silver">
        <span>{{data.length}}
            <table class="table" style="background-color: White">
                <tbody>
                    <tr ng-repeat="task in data">
                        <td>
                            {{task}}
                        </td>
                    </tr>
                </tbody>
            </table>
        </span>
        <div ng-controller="ChildCtrl" class="ng-scope" style="background-color: Green">
            <button ng-click="emit();">
                Emit</button>
        </div>
</body>
</html>


angular.module('test', [])
.controller('ParentCtrl', function($scope, $rootScope) {
    $scope.data = [];
    $scope.$on('something', function(event, data) {
        $scope.data.push("Scope:" + data);
    });
    $rootScope.$on('something', function(event, data) {
        $scope.data.push("rootScope:" + data);
    });
})
.controller('ChildCtrl', function($scope, $rootScope) {
    $scope.value = "from grandson";
    $scope.emit = function() {
        $scope.$emit('something', $scope.value); // вверх!
    }
});


Наверное, руки кривые... Может кто подправит?
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2015, 15:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Заинтересовался так же этим случаем... Даже в один контролеер добавление внес... Так работает, пока на твою кнопку не нажмешь...

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
angular.module('test', [])
	.controller(
		'ParentCtrl', 
		[
			'$scope', 
			'$rootScope',
			function($scope, $rootScope) {
				$scope.data = [0,1,2,3,4];
				$scope.$on('something', function(event, data) {
					$scope.data.push("Scope:" + data);
				});
				$rootScope.$on('something', function(event, data) {
					$scope.data.push("rootScope:" + data);
				});
				$scope.add=function(){
					$scope.data[$scope.data.length]=$scope.data.length;
				};
			}
		]
	)
	.controller(
		'ChildCtrl', 
		[
			'$scope', 
			'$rootScope',
			function($scope, $rootScope) {
				$scope.value = "from grandson";
				$scope.emit = function() {
					$scope.$emit('something', $scope.value); // вверх!
				}
			}
		]
	);
</script>
</head>
<body ng-app="test">
    <div ng-controller="ParentCtrl" class="ng-scope" style="background-color: Silver">
        <span>{{data.length}}</span>
		<table class="table" style="background-color: White">
			<tbody>
				<tr ng-repeat="task in data">
					<td>
						{{task}}
					</td>
				</tr>
			</tbody>
		</table>
		<div>{{data}}</div>
		<button ng-click="add();">Add</button>
        <div ng-controller="ChildCtrl" class="ng-scope" style="background-color: Green">
            <button ng-click="emit();">Emit</button>
        </div>
    </div>
</body>
</html>

Сказать, что представление не видит модели - вроде не скажешь...

Последний раз редактировалось ksa, 25.02.2015 в 15:49.
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2015, 15:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от YuriT64
Может кто подправит?
Моя кнопка (добавление в том же контроллере) работает на добавление.
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2015, 17:39
Новичок на форуме
Отправить личное сообщение для YuriT64 Посмотреть профиль Найти все сообщения от YuriT64
 
Регистрация: 25.02.2015
Сообщений: 3

Сообщение от ksa Посмотреть сообщение
Моя кнопка работает на добавление.
Это, конечно, замечательно, что в некоторых случаях angular все таки работает . Но вопрос был "почему не работает в моем случае"? Это у меня руки кривые или angular кривой?

Последний раз редактировалось YuriT64, 25.02.2015 в 17:45.
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2015, 19:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от YuriT64
вопрос был "почему не работает в моем случае"?
Пока у меня нет ответа... Поскольку все "перехватчики" получают управление и массив меняется.
Ответить с цитированием
  #6 (permalink)  
Старый 26.02.2015, 01:50
Аватар для MetaDriver
Аспирант
Отправить личное сообщение для MetaDriver Посмотреть профиль Найти все сообщения от MetaDriver
 
Регистрация: 24.04.2014
Сообщений: 66

Сообщение от YuriT64 Посмотреть сообщение
Это, конечно, замечательно, что в некоторых случаях angular все таки работает . Но вопрос был "почему не работает в моем случае"? Это у меня руки кривые или angular кривой?
Круто. Похоже на баг в ангуляре. ngRepeat не хочет выводить"дубликаты". Просидел больше часа, удалось заставить работать, только после того как заставил элементы массива быть уникальными. В некоторых случаях может сойти за фичу, но таки "предупреждать же нада, господа разработчики....!!! ".
Короче - пиши маляву ангулярщикам, ежли есть мотивация, лично у меня с "активным английским" хреново. Читать по буржуински кое-как могу, писать - никак.
<!doctype html>
<html>
<head>
    <!--link href="angular/bootstrap.min.css" rel="stylesheet" type="text/css" /-->
    <script src="https://code.angularjs.org/1.3.9/angular.min.js" type="text/javascript"></script>
<script type='text/javascript'>angular.module('test', [])
.controller('ParentCtrl', function($scope, $rootScope) {

*!*
//    $scope.data = ['asddsa','ewqwe','123432','123432','123432'];  
//  если раскоментируешь верхнюю строчку со  $scope.data и закоментируешь нижнюю,
//  то обнаружишь, что всё ломается ещё раньше - уже в момент начальной отрисовки.
//  дубликаты,  мать её.... 
*/!*
    $scope.data = ['asddsa','ewqwe','123432'];

    $scope.$on('something', function(event, _data) {
        $scope.data.push("Scope:" + _data+'-'+$scope.data.length);
    });
    $rootScope.$on('something', function(event, _data) {
        $scope.data.unshift("rootScope:" + _data+'-'+$scope.data.length);
    });
})
.controller('ChildCtrl', function($scope) {
    $scope.value = "from grandson";
    $scope.emit = function() {
        $scope.$emit('something', $scope.value); // вверх!
    }
});

</script>
</head>
<body ng-app="test">
    <div ng-controller="ParentCtrl" style="background-color: Silver">
        <div>{{data.length}}
            <table style="background-color: White">
                <tbody>
                    <tr ng-repeat="task in data">
                        <td>
                            {{$index+')  '+task}}
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div ng-controller="ChildCtrl"  style="background-color: Green">
            <button ng-click="emit();">
                Emit</button>
        </div>
        <div><pre>{{data | json}}</pre></div>
    </div>
</body>
</html>

Последний раз редактировалось MetaDriver, 26.02.2015 в 01:58.
Ответить с цитированием
  #7 (permalink)  
Старый 26.02.2015, 02:14
Аватар для MetaDriver
Аспирант
Отправить личное сообщение для MetaDriver Посмотреть профиль Найти все сообщения от MetaDriver
 
Регистрация: 24.04.2014
Сообщений: 66

Попытка запустить "с дубликатами" в версии 1.4.0, приводит к тому же результату, то бишь баг вполне актуальный.
Значит тебе сюда --> https://github.com/angular/angular.js/issues
<!doctype html>
<html>
<head>
    <!--link href="angular/bootstrap.min.css" rel="stylesheet" type="text/css" /-->
    <script src="https://code.angularjs.org/1.4.0-beta.5/angular.min.js" type="text/javascript"></script>
<script type='text/javascript'>angular.module('test', [])
.controller('ParentCtrl', function($scope, $rootScope) {

*!*
    $scope.data = ['asddsa','ewqwe','123432','123432','123432'];  
//  если раскоментируешь верхнюю строчку со  $scope.data и закоментируешь нижнюю,
//  то обнаружишь, что всё ломается ещё раньше - уже в момент начальной отрисовки.
//  дубликаты,  мать её.... 
*/!*
//    $scope.data = ['asddsa','ewqwe','123432'];

    $scope.$on('something', function(event, _data) {
        $scope.data.push("Scope:" + _data+'-'+$scope.data.length);
    });
    $rootScope.$on('something', function(event, _data) {
        $scope.data.unshift("rootScope:" + _data+'-'+$scope.data.length);
    });
})
.controller('ChildCtrl', function($scope) {
    $scope.value = "from grandson";
    $scope.emit = function() {
        $scope.$emit('something', $scope.value); // вверх!
    }
});

</script>
</head>
<body ng-app="test">
    <div ng-controller="ParentCtrl" style="background-color: Silver">
        <div>{{data.length}}
            <table style="background-color: White">
                <tbody>
                    <tr ng-repeat="task in data">
                        <td>
                            {{$index+')  '+task}}
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div ng-controller="ChildCtrl"  style="background-color: Green">
            <button ng-click="emit();">
                Emit</button>
        </div>
        <div><pre>{{data | json}}</pre></div>
    </div>
</body>
</html>
Ответить с цитированием
  #8 (permalink)  
Старый 26.02.2015, 08:34
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от MetaDriver
gRepeat не хочет выводить"дубликаты"
А мне вот не дает пока плюсануть...

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

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
angular.module('test', [])
	.controller(
		'ParentCtrl', 
		[
			'$scope', 
			'$rootScope',
			function($scope, $rootScope) {
				$scope.data = [
					{name: 0},
					{name: 1},
					{name: 2}
				];
				$scope.$on('something', function(event, data) {
					$scope.data.push({name: "Scope: " + data});
				});
				$rootScope.$on('something', function(event, data) {
					$scope.data.push({name: "rootScope: " + data});
				});
			}
		]
	)
	.controller(
		'ChildCtrl', 
		[
			'$scope', 
			'$rootScope',
			function($scope, $rootScope) {
				$scope.value = "from grandson";
				$scope.emit = function() {
					// вверх!
					$scope.$emit('something', $scope.value); 
				}
			}
		]
	);
</script>
</head>
<body ng-app="test">
    <div ng-controller="ParentCtrl" class="ng-scope" style="background-color: Silver">
        <span>{{data.length}}</span>
		<table class="table" style="background-color: White">
			<tbody>
				<tr ng-repeat="task in data">
					<td>
						{{task.name}}
					</td>
				</tr>
			</tbody>
		</table>
        <div ng-controller="ChildCtrl" class="ng-scope" style="background-color: Green">
            <button ng-click="emit();">Emit</button>
        </div>
    </div>
</body>
</html>
Ответить с цитированием
  #9 (permalink)  
Старый 26.02.2015, 09:35
Новичок на форуме
Отправить личное сообщение для YuriT64 Посмотреть профиль Найти все сообщения от YuriT64
 
Регистрация: 25.02.2015
Сообщений: 3

Всем большое спасибо за участие.
Ответить с цитированием
  #10 (permalink)  
Старый 26.02.2015, 10:17
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

ангулярщики
1. либо http://learn.javascript.ru/play/6zteMb
2. либо
ng-repeat="task in data track by $index"

Лучше второе) А еще лучше
item in items track by item.id


https://code.angularjs.org/1.3.9/doc...eat#animations
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 26.02.2015 в 10:20.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS: работает на сервере, не работает из папки -majestic- Общие вопросы Javascript 2 02.08.2012 14:41
Не работает push! Динамическая вставка TSEH25 ExtJS 5 03.07.2012 13:00
jQyery функция странно работает! Midel Общие вопросы Javascript 4 08.04.2012 13:40
помогите найти ошибку (работает в IE но не работает в Firefox) Len4ik Javascript под браузер 2 11.05.2010 15:41
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 14:11