Angularjs 更新控制器值并从指令调用控制器函数。在调用函数之前未更新控制器计算

Angularjs 更新控制器值并从指令调用控制器函数。在调用函数之前未更新控制器计算,angularjs,scope,angularjs-scope,Angularjs,Scope,Angularjs Scope,我有一个控制器值,该值与指令中的值绑定为= 但是,当我更新指令中的值,然后调用控制器中的函数时,在执行det controller函数之前,控制器值不会得到更新 我就是这样实现的: HTML: JavaScript: 问题在于,在执行搜索函数之前,页面没有更新,因此findCasesByCriteria的页码错误。如果我在指令中调用$scope.searchParent之前超时,则在调用控制器函数之前更新该值我马上想到了两个想法 可以使用“&”而不是“=”将控制器函数传递给隔离作用域。通过这样做

我有一个控制器值,该值与指令中的值绑定为=

但是,当我更新指令中的值,然后调用控制器中的函数时,在执行det controller函数之前,控制器值不会得到更新

我就是这样实现的:

HTML:

JavaScript:


问题在于,在执行搜索函数之前,页面没有更新,因此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();
                }

            }
        }
    )