【问题标题】:AngularJs - Execute Jquery plugin after rest call and DOM changeAngularJs - 在休息调用和 DOM 更改后执行 Jquery 插件
【发布时间】:2014-05-09 17:09:18
【问题描述】:

我正在运行 AngularJS 来管理 WebApp 和操纵 DOM 的 jQuery 插件(我没有选择混合或两者都不混合)。

这是我的html

<ul jQuery-plugin-directive="{{changeAfterSuccess}}">
    <li ng-repeat="var in varList">
    {{var.attr}}
    </li>
</ul>

这是指令

app.directive('jQueryPluginDirective',['$timeout', function (timer) {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            var myFunctionToExecuteAfterDomMod = function(){
                      //element.myPluginJquery
            }
    }
    };
}]);

这是我的控制器:

app.controller('homeController', ['$scope', 'anHttpService', function ($scope, documentService) {
        anHttpService.getVarList().success(function (result) {
            $scope.varList = result.var;
            //$scope.changeAfterSuccess = "sthg";
        });
    }]);

如果我在 myFunctionToExecuteAfterDomMod 上使用 0 毫秒的计时器,它就不起作用。

如果我使用 attrs.$observe("jQueryPluginDirective", myFunctionToExecuteAfterDomMod) 并更改 changeAfterSuccess。 这不起作用。

我成功使用它的唯一方法是使用超过 10 毫秒的计时器。但我不想使用这种丑陋的解决方案。

这确认 myFunctionToExecuteAfterDomMod 在 {{var.attr}} 更改之前被调用,这就是它不起作用的原因......

现在搜索了2个小时的解决方案,我很绝望,我希望有人有一个好的解决方案。

巴斯蒂安

更新

我现在做我应该做的事情。我确信这一点,因为当我应用简单的 DOM 修改(如 css 值更改)时,它运行良好。问题是插件 jstree 如果我不设置 200 毫秒计时器,它就不起作用......我现在将使用“解决方案”,然后找到一种不使用插件的方法。

【问题讨论】:

  • 您能指定操作顺序吗?哪一个?执行RESTApi,然后使用Jquery 更改dom?还是运行 Jquery 并在之后执行 RESTApi?
  • 在标记中引用你的指令是错误的,应该是:&lt;ul j-query-plugin-directive=
  • 将 $watch 添加到您的指令中,该指令在 varList 更改后执行。在此处查看如何执行此操作的简单示例。 stackoverflow.com/questions/21779094/…
  • @Aidin:我想在 RestAPI 之后运行 jQUery
  • 你是什么意思它不会在 DOM 更改后工作?请详细说明。一个笨拙的人会有所帮助

标签: javascript jquery angularjs rest jstree


【解决方案1】:

您可能需要将变量作为单独的参数传递:

app.directive('jQueryPluginDirective',['$timeout', function (timer) {
    return {
        restrict: 'A',
        scope: {
           data: "="
        },
        link: function(scope, element, attrs) {
            var myFunctionToExecuteAfterDomMod = function(){
                      //element.myPluginJquery
            }
            scope.$watch('data', function(newVal, oldVal){
               alert('data changed'); // probably want to use console.log() here instead
            }
        }
    };
}]);

那么您的 HTML 将如下所示:

<ul jQuery-plugin-directive data="changeAfterSuccess">

更新:

另外,为什么不在指令中传递数据并生成 html:

控制器 HTML:

<jQuery-plugin-directive change="{{changeAfterSuccess}}" data="varList"></jQuery-plugin-directive>

指令中的JS

app.directive('jQueryPluginDirective',['$timeout', function (timer) {
    return {
        restrict: 'A',
        scope: {
           data: "=",
           change: "="
        },
        template: "<ul> 
                       <li ng-repeat="var in varList">
                           {{var.attr}}
                       </li>
                   </ul>", // concatenate these lines in to a string
        link: function(scope, element, attrs) {
            var myFunctionToExecuteAfterDomMod = function(){
                      //element.myPluginJquery
            }
            scope.$watch('data', function(newVal, oldVal){
               alert('data changed'); // probably want to use console.log() here instead
            }
        }
    };
}]);

【讨论】:

  • 我尝试这样做,但总是有 ReferenceError: test (replaceing data of your example) is not defined
  • 抱歉,忘记了,数据必须是“数据”(引号)
  • 我不明白为什么,但模板不会在不显示错误的情况下附加其值。
  • 如果我不使用它,插件可以工作,但奇怪的是 {{}} 中的值不会被替换并显示为 {{object.attr}}。
  • 我设法使它工作的唯一方法是使用 timer(myFunctionToExecuteAfterDomMod, 200);在 $watch...
【解决方案2】:

虽然 EliteOctagon 已经说过所有内容,但这里是一个向您展示如何使用观察者的最小指令:

    app.directive('makered', function() {
      return {
        restrict: 'AC',
        controller: function($scope) {
          return $scope.$watch(function(e) {
            $('.item').css('color', rcolor);
          });
        }
      };
    });

看看这个Plunker怎么用,然后试着理解EliteOctagons代码。 (不能在 plunker 中使用 ajax,所以我模拟了范围更改)

【讨论】:

  • 嗨!我确实了解代码,并且我现在应该做的事情。我确信这一点,因为当我应用简单的 DOM 修改时,它运行良好。如果我不放一个 200 毫秒的计时器,它是与插件 jstree 一起工作的......
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多