【问题标题】:How to change angular ng-init attributewith jquery如何使用 jquery 更改角度 ng-init 属性
【发布时间】:2016-07-26 03:58:50
【问题描述】:

所以,我有一个带有图像的 div,当发生特定滚动时,我想将其更改为 gif...

这里是html:

    <div class="col-xs-6 mitad" ng-init="varname='images/estandar/impresoraEstandarAnimada.gif'" id="seccion3B">
        <img ng-src="{{varname}}" id="gif">
    </div>

现在,想法是,更改 varname 中的 url...我尝试了这个但没有用:

if ($(window).width() > 1700 && vistaEstandar.scrollTop > 1596 && vistaEstandar.scrollTop < 2490)
       {
            lore: 'url(../images/estandar/monitorVeloz1.gif)';
            $("#gif").attr("ng-src", "{{lore}}");
        }

知道如何让它工作吗?我不太了解 Angular(编程新手),如果我尝试通过仅替换 img 标记中的 SRC 属性来更改它而不使用 Angular,则 gif 将第一次加载,但如果在 if 条件下再次输入或者如果我刷新网站,加载为静态图片

更新:

所有这些 js 代码都已经在控制器中了:

app.controller('estandarCtrl', function ($scope, $rootScope, $routeParams, $location, $http, Data) 
{


$(document).ready(function(){
    // ----Clases para mantener los colores del header
    $(".navbar-header").addClass("fondoHeader");
    $("#fondoMenu").addClass("fondoHeader");
    $("#footer").removeClass("esconder");
    $("#social").removeClass("esconder");
    $(".navbar-brand").removeClass("esconder");
    $("#botonVideo").removeClass("fondoBoton");
    $("#vista").removeClass("barraVista");


    // ----Propiedades para los scrollbar
    var vistaEstandar = document.getElementById('vista');
    vistaEstandar.style.overflow= "auto";
    vistaEstandar.style.overflowX= "hidden";
    vistaEstandar.style.height = 100 + "%";
    $("#vista").smoothWheel();
    // ---animaciones para diferentes resoluciones
    vistaEstandar.onscroll = function() {animacionesEstandarVista()};
    function animacionesEstandarVista() 
    {

        if (($(window).width() > 1700 && vistaEstandar.scrollTop > 1596 && vistaEstandar.scrollTop < 2490) || ($(window).width() > 1700 && document.documentElement.scrollTop > 1596 && document.documentElement.scrollTop < 2490)){



        }
        else if (($(window).width() > 1700 && vistaEstandar.scrollTop > 3888 && vistaEstandar.scrollTop < 4286) || ($(window).width() > 1700 && document.documentElement.scrollTop > 3888 && document.documentElement.scrollTop < 4286)) {
            document.getElementById("section6").style.background = "url(images/estandar/monitorEstandarEntrada.gif)";
            document.getElementById("section6").style.backgroundSize = "cover";
            document.getElementById("section6").style.backgroundPosition = "bottom";

        }
        else if (($(window).width() > 1700 && vistaEstandar.scrollTop > 4450) || ($(window).width() > 1700 && document.documentElement.scrollTop > 4450)) { 
            document.getElementById("section6").style.background = "url(images/estandar/monitorEstandarSalida.gif)";
            document.getElementById("section6").style.backgroundSize = "cover";
            document.getElementById("section6").style.backgroundPosition = "bottom";    
        }
        else
        {

        } 

});
});

所以我已经有一个部分控制器

【问题讨论】:

  • 这段代码写在哪里?
  • 你为什么使用 Angular?你不能只改变img 中的src 属性吗?
  • 我不能,因为我解释的原因......当它改变时...... gif 不起作用......它只在第一次打开页面时作为 gif 工作。 ..如果重新加载它将无法工作。现在,gif 只是一个一次性循环 gif
  • @Caro 检查我的答案,看看是否符合您的要求

标签: jquery html angularjs if-statement


【解决方案1】:

在你的 html 元素上,也就是你的滚动条上,使用 ngChange 指令并传递一个函数来改变你的 url 变量:

HTML:

<!-- change scrollable element to whatever the scroll bar is on aka table... ect -->
<div>
    <scrollable-element ng-change="myChangeFunction()"></scrollable-element>
</div>

JS:

// inside your controller:
$scope.myChangeFunction = function() {
        var newUrl = '/some/image.img'
        $scope.varname = newUrl;
    };

【讨论】:

    【解决方案2】:

    在使用 Angular js 时,最好避免使用 jQuery。

    最简单的答案是,您需要创建一个控制器并将其分配给您的 div。

    在您的控制器中,您可以将滚动事件绑定到 $document(javascript 的文档对象)或 $window(javascript 的窗口对象)。下面是示例代码。

    angular.module('abc',[])
         .controller('abcController', ['$scope','$window',function($scope,$window){
        angular.element($window).on('scroll',function(){
            // To access scrollX use $window.scrollX
            if($window.scrollY > 100){
               $scope.varname = 'someurl';// set varname to some url
               $scope.$apply();// this is to run the angular digest cycle, in short refreshing your div
            }
    
        });
    }]);
    

    在您的 HTML 中:

    <div class="col-xs-6 mitad" ng-controller="abcController" ng-init="varname='images/estandar/impresoraEstandarAnimada.gif'" id="seccion3B">
        <img ng-src="{{varname}}" id="gif">
    </div>
    

    希望这会有所帮助!

    【讨论】:

    • @Caro,请找到我的代码来检查如何获取 scrollTop 或 scrollY,$window 对象具有您需要的所有属性。
    • 如果不打算使用 jQuery,需要使用 bind() 而不是 on()。 jQlite 没有on()。这也属于指令
    • docs.angularjs.org/api/ng/function/angular.element,请查看文档,jqlite支持on()方法
    【解决方案3】:

    你的建议不是最优的,但既然你问了怎么做,这里是解决方案:

    Working DEMO

    想法是,从 jQuery 开始,您必须设置 $scope 属性并调用 $scope.$apply() 以将更改呈现到屏幕上。

    $(function () {
      $(window).on("scroll", function () {
        var scope = angular.element("#gif").scope();
        if ($(window).scrollTop() > 100) {
          scope.$apply(function () {
            scope.varname = "mynewurl.gif";
          });
        }
        else {
          scope.$apply(function () {
            scope.varname = "images/estandar/impresoraEstandarAnimada.gif'";
          });
        }
      });
    });
    

    编辑

    在您发布更新后的代码后,我可以看到您将所有 jQuery 代码放入 Angular 控制器中。你的 $(function () {...});应该在您的角度控制器之外

    【讨论】:

    • 我需要 scrollTop 的值...如果我使用 () 它不会给我任何数字,因此 if 条件永远不会发生
    • @Caro 抱歉,我假设您的“vistaEstandar”变量是一个 jQuery 对象,而不是一个普通的 JS DOM 节点。既然如此,是的,scrollTop 是获取数字的正确方法
    • 我知道你是对的,但由于某种原因,如果我把它放在我的控制器之外,一些功能会停止运行。例如,我不能滚动,它对整个 Angular 的行为都很有趣。我正在继续这项工作,还没有使用角度,所以......我只能让它在控制器内工作
    • 这属于指令
    • @charlietfl 我同意,但是 OP 询问如何从 jQuery 中做到这一点,所以这就是我展示的方法
    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2019-06-27
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多