2013-09-03 2 views
2

Угловое достаточно умное, чтобы напрямую связывать обещания. У меня есть экземпляр ng-grid, который связан с обещанием, возвращаемым службой. Позже я хочу удалить одну запись в этой сетке, но я не уверен, как это сделать, поскольку у меня нет массива для непосредственного управления.

Например, следующее вызовет ошибку «TypeError: Object # не имеет метода« сращивания », поскольку« gridData »на самом деле не является массивом.

//Bind promise directly to scope (get returns a promise not an array) 
$scope.gridData = myService.get(); 

//Later I remove a row based on user a user clicking a button on the grid row. 
var function = removeRow(rowIdx) 
    { 
     $scope.gridData.splice(rowIdx, 1); 
    }; 

В конечном счете, как я могу задать значения объема для обещаний и по-прежнему напрямую манипулировать данными?

ответ

3

Вы не можете изменить значение обещания после его разрешения.

Что вы можете сделать, это установить фактическое значение свойства scope и изменить его. Фактически, вы должны как можно скорее избавиться от обещания.

//Bind promise directly to scope (get returns a promise not an array) 
myService.get().then(function (resolved) { 
    $scope.gridData = resolved; 
}); 

//Later I remove a row based on user a user clicking a button on the grid row. 
function removeRow(rowIdx) { 
    $scope.gridData.splice(rowIdx, 1); 
}; 
+2

Да. Используйте обещания только для данных «показывать только» ... в противном случае на самом деле привязать значения к области. – TheHippo

0

Существуют различные способы сделать это. Один из них заключается в написании filter который ломтиков ваш массив:

.filter("slice", function() { 
    return function (array, begin, end) { 
     if (!angular.isArray(array)) return; 
     return array.slice(begin, end); 
    }; 
}); 

и использовать его на сбор в нг-повтора:

<li ng-repeat="item in (data|slice:1)">{{item}}</li> 

Working example.

Кроме того, так как ваши данные возвращаются с обещанием , ничто не останавливается от простого добавления then к контроллеру:

$scope.gridData = myService.get().then(function (data) { 
    return data.slice(1) 
}); 

Working example.

+0

Должно быть, я был более ясен. Скрещивание происходит в какой-то неопределенной точке в будущем, когда пользователь нажимает кнопку в сетке. Это означает, что я заполняю сетку полным набором данных. –

+0

Затем вместо среза: 1, срез: start следует использовать с $ scope.start === undefined. Когда пользователь хочет нарезать строку, вы меняете начальное значение, и просмотр автоматически обновляется. Я изменил первый пример, чтобы вести себя так, проверьте это. –

0

Массив анализируемые данные подвергается воздействию на $scope.gridOptions.ngGrid.data (предполагается, что ваш ngGrid обязан gridOptions) - вы можете быть в состоянии управлять им напрямую, хотя я не пробовал это