Обновить шаблон директивы при изменении переменной контроллера - angularjs

89
12

То, что я пытаюсь сделать, - это получить объект JSON из запроса $ http, запрошенный внутри контроллера, и создать директиву, которая отображает несколько объектов в объекте JSON в сетке.

Проблема в том, что когда объект прибывает, я должен обработать его в контроллере директивы, чтобы иметь возможность использовать его в шаблоне, как таковой, когда объект JSON изменяется, он не отражается в шаблоне. Как я могу сообщить директиве об изменении объекта и заставить его перезагрузить шаблон?

// The Directive code
amobile.directive('grid', function() {
return {
restrict: 'E',
scope: {
break: '=break',
source: '=source'
},
controller: function($scope) {
var source = $scope.source;
$scope.final_data = new Array(source.length);
if(source){
for(var j=0; j < source.length; ++j){
var total = Math.ceil(source[j]['Division'].length / $scope.break);
var data = new Array(total);
for (var i = 0; i < total; ++i) {
data[i] = source[j]['Division'].slice(i * $scope.break, (i + 1) * $scope.break);
}
$scope.final_data[j] = data;
}
}

},
templateUrl:'directives/grid.tpl.html',
replace: true
};
});

//The template
<div ng-repeat="data in final_data">
<div layout="vertical" layout-sm="horizontal" layout-padding class="" ng-repeat="row in data">
<div class="" ng-repeat="item in row">
<div flex style="width:100px">
{{item.name}}
</div>
</div>
</div>

//index.html
<div ng-controller="DivisionsCtrl as div">
<material-button ng-click="div.go()" class="material-theme-red">Button</material-button>
<div ng-if="div.data.floors">
<gridy break="3" source="div.data.floors"/>
</div>

спросил(а) 2021-01-25T17:19:47+03:00 4 месяца, 3 недели назад
1
Решение
88

самым простым решением было бы использовать часы

controller: function($scope) {
processData = function () {
var source = $scope.source;
$scope.final_data = new Array(source.length);
if(source){
for(var j=0; j < source.length; ++j){
var total = Math.ceil(source[j]['Division'].length / $scope.break);
var data = new Array(total);
for (var i = 0; i < total; ++i) {
data[i] = source[j]['Division'].slice(i * $scope.break, (i + 1) * $scope.break);
}
$scope.final_data[j] = data;
}
}
}
$scope.$watch('div.data.floors', processData, true)

},

ответил(а) 2021-01-25T17:19:47+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема