如何避免 two-way 绑定导致的摘要周期延迟
How to avoid digest cycle delay from two-way binding
Angularjs何时触发双向数据绑定?
在 AngularJS 应用程序中,我有一个 parent 指令和一个 child 指令。
parent指令
angular
.module('myApp')
.directive('customForm', function(customService, apiV1, Constants, $timeout) {
return {
restrict: 'E',
scope: {
param1: '=',
param2: '=?',
boolean1: '@?'
},
template,
link: function(scope, parentController) {
scope.data = customService.newClient;
//some stuff...
child指令 JS:
angular
.module('myApp')
.directive('customToolForm', function () {
return {
restrict: 'E',
scope: {
name: '=',
city: '=',
postalCode: '='
},
template,
controller: function ($scope, $rootScope, Constants, apiV1, customService) {
$scope.doSomethingWithPostalCode = function() {
$scope.$parent.doSomethingWithPostalCode();
}
//some stuff...
parent指令HTML片:
<address-client-creation name="data.client.name" city="data.client.city"
postal-code="data.client.postalCode">
</address-client-creation>
child指令HTML片:
<input maxlength="5" type="text" data-ng-model="postalCode"
data-ng-change="doSomethingWithPostalCode();">
我遇到的问题是:
当child指令触发方法doSomethingWithPostalCode
时,child中的postalCode值与client.postalCode中的值不同=45=],但在方法的最后是。
似乎更新 parent 值的双向绑定事件发生在函数调用之后
所以我的问题是确保在调用方法之前更新 $parent 范围的最佳方法是什么?
如何避免双向绑定造成摘要周期延迟
AngularJS 框架通过向子作用域添加观察器来实现双向 ('='
) 绑定,将数据从子作用域传输到父作用域。观察者需要一个摘要周期来检测变化并进行传输。
一种更现代的方法是对输入使用单向 ("<"
) 绑定,对输出使用表达式 ("&"
) 绑定:
app.directive('customToolForm', function () {
return {
restrict: 'E',
scope: {
name: '<',
city: '<',
̶p̶o̶s̶t̶a̶l̶C̶o̶d̶e̶:̶ ̶'̶=̶'̶
postalCode: '<',
postalCodeChange: '&',
},
template: `
<input maxlength="5" type="text" data-ng-model="postalCode"
data-ng-change="doSomethingWithPostalCode(postalCode);">
`,
controller: function ($scope, $rootScope, Constants, apiV1, customService) {
$scope.doSomethingWithPostalCode = function(postalCode) {
̶$̶s̶c̶o̶p̶e̶.̶$̶p̶a̶r̶e̶n̶t̶.̶d̶o̶S̶o̶m̶e̶t̶h̶i̶n̶g̶W̶i̶t̶h̶P̶o̶s̶t̶a̶l̶C̶o̶d̶e̶(̶)̶;̶
$scope.postalCodeChange({$event: postalCode});
}
//some stuff...
用法:
<custom-form-tool
name="data.client.name" city="data.client.city"
postal-code="data.client.postalCode"
postal-code-change="data.client.postalCode=$event; doSomething($event)"
>
</custom-form-tool>
使用表达式 ("&"
) 绑定立即使事件数据可用于父控制器。
这也让迁移到 Angular 2+ 更容易。
有关详细信息,请参阅
我找到的解决方案是在 childDirective 中使用 $watch
:
/**
* Using $watch instead of data-ng-change ensure that bindings are updated
*/
$scope.$watch('postalCode', function() {
$scope.$parent.doSomethingWithPostalCode();
});
因此在子指令的输入中删除 the data-ng-change
:
<input maxlength="5" type="text" data-ng-model="postalCode">
在 $watch 方法内部调试时,我可以验证父 $scope 已经更新。
不确定它是真正的解决方案还是更像是黑客。
Angularjs何时触发双向数据绑定?
在 AngularJS 应用程序中,我有一个 parent 指令和一个 child 指令。
parent指令
angular
.module('myApp')
.directive('customForm', function(customService, apiV1, Constants, $timeout) {
return {
restrict: 'E',
scope: {
param1: '=',
param2: '=?',
boolean1: '@?'
},
template,
link: function(scope, parentController) {
scope.data = customService.newClient;
//some stuff...
child指令 JS:
angular
.module('myApp')
.directive('customToolForm', function () {
return {
restrict: 'E',
scope: {
name: '=',
city: '=',
postalCode: '='
},
template,
controller: function ($scope, $rootScope, Constants, apiV1, customService) {
$scope.doSomethingWithPostalCode = function() {
$scope.$parent.doSomethingWithPostalCode();
}
//some stuff...
parent指令HTML片:
<address-client-creation name="data.client.name" city="data.client.city"
postal-code="data.client.postalCode">
</address-client-creation>
child指令HTML片:
<input maxlength="5" type="text" data-ng-model="postalCode"
data-ng-change="doSomethingWithPostalCode();">
我遇到的问题是:
当child指令触发方法doSomethingWithPostalCode
时,child中的postalCode值与client.postalCode中的值不同=45=],但在方法的最后是。
似乎更新 parent 值的双向绑定事件发生在函数调用之后
所以我的问题是确保在调用方法之前更新 $parent 范围的最佳方法是什么?
如何避免双向绑定造成摘要周期延迟
AngularJS 框架通过向子作用域添加观察器来实现双向 ('='
) 绑定,将数据从子作用域传输到父作用域。观察者需要一个摘要周期来检测变化并进行传输。
一种更现代的方法是对输入使用单向 ("<"
) 绑定,对输出使用表达式 ("&"
) 绑定:
app.directive('customToolForm', function () {
return {
restrict: 'E',
scope: {
name: '<',
city: '<',
̶p̶o̶s̶t̶a̶l̶C̶o̶d̶e̶:̶ ̶'̶=̶'̶
postalCode: '<',
postalCodeChange: '&',
},
template: `
<input maxlength="5" type="text" data-ng-model="postalCode"
data-ng-change="doSomethingWithPostalCode(postalCode);">
`,
controller: function ($scope, $rootScope, Constants, apiV1, customService) {
$scope.doSomethingWithPostalCode = function(postalCode) {
̶$̶s̶c̶o̶p̶e̶.̶$̶p̶a̶r̶e̶n̶t̶.̶d̶o̶S̶o̶m̶e̶t̶h̶i̶n̶g̶W̶i̶t̶h̶P̶o̶s̶t̶a̶l̶C̶o̶d̶e̶(̶)̶;̶
$scope.postalCodeChange({$event: postalCode});
}
//some stuff...
用法:
<custom-form-tool
name="data.client.name" city="data.client.city"
postal-code="data.client.postalCode"
postal-code-change="data.client.postalCode=$event; doSomething($event)"
>
</custom-form-tool>
使用表达式 ("&"
) 绑定立即使事件数据可用于父控制器。
这也让迁移到 Angular 2+ 更容易。
有关详细信息,请参阅
我找到的解决方案是在 childDirective 中使用 $watch
:
/**
* Using $watch instead of data-ng-change ensure that bindings are updated
*/
$scope.$watch('postalCode', function() {
$scope.$parent.doSomethingWithPostalCode();
});
因此在子指令的输入中删除 the data-ng-change
:
<input maxlength="5" type="text" data-ng-model="postalCode">
在 $watch 方法内部调试时,我可以验证父 $scope 已经更新。
不确定它是真正的解决方案还是更像是黑客。