angular 在 ajax 成功时应用 ng-hide
angular apply ng-hide on ajax success
我正在尝试通过双击名称来显示输入字段。这很好用!但是,如果我的 put-request 成功,我该如何切换回来?我以为我只需要将 $scope.edit 设置为 false 但它不起作用。 (今天 angular 迈出了我的第一步)
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-hide="edit" ng-dblclick="edit = true;">{{ customer.name }}</span>
<label ng-show="edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>,
<small ng-bind="customer.created_at"></small>
<button ng-click="deleteCustomer($index, customer)">-</button>
</li>
</ul>
控制器:
$scope.editCustomer = function (index, customer, event) {
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
// update customer.name binding
$scope.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
$scope.edit = false;
}
};
或者这种方法是否有更好的解决方案?
如果您想显示和隐藏您的输入,您必须同时使用 ng-hide 和 ng-show。
这不合逻辑,但却是它在我的控制器中工作的唯一方式,可能是一个错误。
<label ng-show="edit" ng-hide="edit-hide">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>
// Show control
$scope.edit = true;
$socpe.edit_hide = false;
// Hide control
$scope.edit = false;
$scope.edit_hide = true;
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-show="!edit" ng-dblclick="edit = true;">{{ customer.name }}</span>
<label ng-show="edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>,
<small ng-bind="customer.created_at"></small>
<button ng-click="deleteCustomer($index, customer)">-</button>
</li>
</ul>
控制器:
$scope.editCustomer = function (index, customer, event) {
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
// update customer.name binding
$scope.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
// $scope.edit = false;
}
};
记住在控制器启动时设置默认值 $scope.edit = false。
这是一个常见问题。默认情况下 ng-repeat
创建一个子范围或独立范围。所以现在你试图在 ng-repeat
创建的子范围内设置一个变量 edit
但不在你的实际控制器的范围内。
但是在您的控制器中,您再次尝试在父作用域而不是 `ng-repeat' 的子作用域上设置它的 false 值。要解决此问题,您需要为此变量使用一个对象。
此行为在此处得到了正确解释:https://github.com/angular/angular.js/wiki/Understanding-Scopes
所以像这样修改您的 HTML 代码:
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-show="!customer.edit" ng-dblclick="customer.edit = true;">{{customer.name}}</span>
<label ng-show="customer.edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($event)"/>
</label>
</li>
</ul>
您的控制器代码为:
$scope.editCustomer = function (event) {
var customer = this.customer; // current customer can be directly accessed via this
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
customer.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
customer.edit = false;
}
};
希望对您有所帮助!
谢谢,
SA
我正在尝试通过双击名称来显示输入字段。这很好用!但是,如果我的 put-request 成功,我该如何切换回来?我以为我只需要将 $scope.edit 设置为 false 但它不起作用。 (今天 angular 迈出了我的第一步)
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-hide="edit" ng-dblclick="edit = true;">{{ customer.name }}</span>
<label ng-show="edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>,
<small ng-bind="customer.created_at"></small>
<button ng-click="deleteCustomer($index, customer)">-</button>
</li>
</ul>
控制器:
$scope.editCustomer = function (index, customer, event) {
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
// update customer.name binding
$scope.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
$scope.edit = false;
}
};
或者这种方法是否有更好的解决方案?
如果您想显示和隐藏您的输入,您必须同时使用 ng-hide 和 ng-show。 这不合逻辑,但却是它在我的控制器中工作的唯一方式,可能是一个错误。
<label ng-show="edit" ng-hide="edit-hide">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>
// Show control
$scope.edit = true;
$socpe.edit_hide = false;
// Hide control
$scope.edit = false;
$scope.edit_hide = true;
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-show="!edit" ng-dblclick="edit = true;">{{ customer.name }}</span>
<label ng-show="edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($index, customer, $event)"/>
</label>,
<small ng-bind="customer.created_at"></small>
<button ng-click="deleteCustomer($index, customer)">-</button>
</li>
</ul>
控制器:
$scope.editCustomer = function (index, customer, event) {
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
// update customer.name binding
$scope.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
// $scope.edit = false;
}
};
记住在控制器启动时设置默认值 $scope.edit = false。
这是一个常见问题。默认情况下 ng-repeat
创建一个子范围或独立范围。所以现在你试图在 ng-repeat
创建的子范围内设置一个变量 edit
但不在你的实际控制器的范围内。
但是在您的控制器中,您再次尝试在父作用域而不是 `ng-repeat' 的子作用域上设置它的 false 值。要解决此问题,您需要为此变量使用一个对象。
此行为在此处得到了正确解释:https://github.com/angular/angular.js/wiki/Understanding-Scopes
所以像这样修改您的 HTML 代码:
<ul>
<li ng-repeat="customer in customers">
<label>
<input type="checkbox" ng-model="customer.selected"/>
</label>
<span ng-show="!customer.edit" ng-dblclick="customer.edit = true;">{{customer.name}}</span>
<label ng-show="customer.edit">
<input type="text" ng-model="customer.name" ng-keyup="editCustomer($event)"/>
</label>
</li>
</ul>
您的控制器代码为:
$scope.editCustomer = function (event) {
var customer = this.customer; // current customer can be directly accessed via this
// enter
if (event.keyCode === 13) {
$http.put('customers/' + customer.id, customer).success(function () {
customer.edit = false;
})
}
// esc, do nothing and revert
else if (event.keyCode === 27) {
customer.edit = false;
}
};
希望对您有所帮助!
谢谢,
SA