Angularjs 更新控制器值并从指令调用控制器函数。在调用函数之前未更新控制器计算
我有一个控制器值,该值与指令中的值绑定为= 但是,当我更新指令中的值,然后调用控制器中的函数时,在执行det controller函数之前,控制器值不会得到更新 我就是这样实现的: HTML: JavaScript:Angularjs 更新控制器值并从指令调用控制器函数。在调用函数之前未更新控制器计算,angularjs,scope,angularjs-scope,Angularjs,Scope,Angularjs Scope,我有一个控制器值,该值与指令中的值绑定为= 但是,当我更新指令中的值,然后调用控制器中的函数时,在执行det controller函数之前,控制器值不会得到更新 我就是这样实现的: HTML: JavaScript: 问题在于,在执行搜索函数之前,页面没有更新,因此findCasesByCriteria的页码错误。如果我在指令中调用$scope.searchParent之前超时,则在调用控制器函数之前更新该值我马上想到了两个想法 可以使用“&”而不是“=”将控制器函数传递给隔离作用域。通过这样做
问题在于,在执行搜索函数之前,页面没有更新,因此findCasesByCriteria的页码错误。如果我在指令中调用$scope.searchParent之前超时,则在调用控制器函数之前更新该值我马上想到了两个想法 可以使用“&”而不是“=”将控制器函数传递给隔离作用域。通过这样做,您可以从指令调用函数,确信值已更改
否则,您可以在控制器中的变量上设置$watch,该变量在值更改时调用函数。我认为您的问题是由于您在子范围内。有关更多信息,请参见此处 你能试试这个吗:
<my-directive search-criterias="searchCriterias" search-parent="search()" ></my-directive>
以及:
我认为没有必要做任何事情。在为指令调用函数之前,只需添加$.apply函数
app.directive('myDirective', function () {
return {
restrict: 'E',
template: "<div><button ng-click='nextPage()'>next</button></div>",
replace: true,
scope: { page: '=', searchParent: '&searchParent' }
},
link: function ($scope, element, attr) {
$scope.nextPage(){
$scope.page++;
$scope.$apply();
$scope.searchParent();
}
}
}
)
就这样,应该行了 那没什么区别创建绑定,以便在隔离作用域中更改属性会反映在相应父作用域的属性中。谢谢,它解决了问题!:而@zeroplagl正是我所想的。但我认为这可能解决了问题,因为它现在是一个对象引用,而不是一个值的引用?@Erex我想这是因为searchCriterias.page不是作用域的属性,而是属性的属性。这是有道理的。当你传递一个对象时,你是通过引用而不是通过值传递的。这意味着您所做的任何更改都将应用于相同的内存中对象。但是,如果您通过值传递,Angular仍将能够应用双向绑定,但只有在激活监视程序时才能应用双向绑定,这将仅在执行下一页后发生。
<my-directive search-criterias="searchCriterias" search-parent="search()" ></my-directive>
app.directive('myDirective', function () {
return {
restrict: 'E',
template: "<div><button ng-click='nextPage()'>next</button></div>",
replace: true,
scope: { searchCriterias: '=', searchParent: '&searchParent' },
link: function ($scope, element, attr) {
$scope.nextPage(){
$scope.searchCriterias.page++;
$scope.searchParent();
}
}
}
);
app.directive('myDirective', function () {
return {
restrict: 'E',
template: "<div><button ng-click='nextPage()'>next</button></div>",
replace: true,
scope: { page: '=', searchParent: '&searchParent' }
},
link: function ($scope, element, attr) {
$scope.nextPage(){
$scope.page++;
$scope.$apply();
$scope.searchParent();
}
}
}
)