我有一個顯示SQL數據的表。我試圖只允許用戶編輯一行中的條目,如果該值已經存在於該列中的某處。臨時ng模型?
例如,如果我想在列更改值「Strawberry
」「Fruit
」到「Grape
」,當我點擊了文本字段,它應該只保留價值「Grape
」,如果它已經存在於「Fruit
」欄中。否則,它應該返回到「Strawberry
」。
我試圖做到這一點,像這樣:
在ng-focus
,我打電話recordValue()
。這將獲取整行,列和值,並將其設置爲一個單獨的變量。
在ng-blur
,我打電話validateValue()
,並檢查所有我行對
一)原行索引
B),看看是否值在表中的任何行已存在
c)如果存在,則保留它,否則恢復原始值
(使用原始行變量替換原始行索引處的編輯行)
但是,行I通過的是ng-model
的row[column]
(行中列的值)。這意味着我無法獲得該行的原始值,因爲它會在更改原始數據時更新原始數據。
爲了解決這個問題,我在數據上創建了一個$watch
。如果$scope.validated
的值爲true,請更新該表用作數據源的變量。否則,不要。當調用recordValue()
時$scope.validated
設置爲false,在遍歷validateValue()
並查找值或重置它之後爲true。
問題是,數據仍然更新,所以我不能恢復該值,因爲原來的行不存在;當我遍歷數據源時,只有更新的行存在。我找不到原始行恢復爲。
我不知道爲什麼會發生這種情況。我做錯了什麼嗎?
HTML:
<table>
<tr>
<th ng-repeat="columnName in columnArray">{{columnName}}</th>
</tr>
<tr ng-repeat="row in filteredData">
<td ng-repeat="columnName in columnArray">
<input ng-model="row[columnName]" ng-focus="recordValue(row,row[column])" ng-blur="validateValue(row,column,row[column])">
</td>
</tr>
</table>
角:
$scope.recordValue = function (row, val) {
$scope.originalRow = row;
$scope.originalValue = val;
$scope.validated = false;
};
$scope.validateValue = function (row, column, val) {
// row is the row of data the text field is in
// column is column name at row
// val is value at column in row(ng-model on $scope.data)
var indexOfOriginalRow;
for (var i = 0; i < $scope.data.length; i++) {
var currentRow = $scope.data[i];
if (currentRow == $scope.originalRow) {
console.log("found it!");
indexOfOriginalRow = i;
}
else if (currentRow[column] == val) {
$scope.validated = true;
// the value was found, keep it as is
return;
}
}
$scope.validated = true;
$scope.data[index][column] = $scope.originalValue;
};
$scope.$watch("data", function() {
if ($scope.validated) {
$scope.filteredData = doStuffWithData($scope.data);
}
}, true);
每一行是一個數組(數據源)內的對象。當值更改時,我更新PARENT數據源,但不更新表中使用的數據源。不幸的是,似乎表的數據源(filteredData)無論如何都會更新。
這可以防止我重置文本字段的值,因爲數據源中的值已更新,所以它似乎已經存在於表中。這似乎是一個邏輯錯誤,但很難概念化表和可變數據結構,所以我找不到錯誤。
UPDATE:
即使我只店的價值,而不是原始行的參考,更大的問題是,仍然是數據更新。原始行是無用的,因爲新行已經在數據源中,這意味着它將被查找,被視爲預先存在的值,並允許您輸入任何內容。非常令人沮喪。
'ng-model'會更新值,你能更新'validateValue()'裏面的值而不是使用'ng-model'嗎? – 2014-09-24 20:25:38
我可以,但我不得不重構許多圍繞此功能構建的代碼。我沒有提前告知這是一個理想的功能,所以我無法優化它。否則,我不會使用'ng-model'。 – 2014-09-24 20:27:06
您確定正在執行模糊/焦點的順序嗎?如果是這樣,那麼你可能只需要添加一個else,所以你只檢查匹配的值,如果該行不是當前的。因爲現在你將總是設置'$ scope.validated = true;',因爲新值將與更新後的值相匹配。 – 2014-09-24 20:31:24