css - 当我使用 jquery 更改 div 类时,AngularJs 翻译指令停止工作

标签 css angularjs responsive-design angularjs-directive angularjs-scope

好吧,直截了当的问题是我的 $scope.$apply() 也没有消化更改以重新运行翻译指令。 我向您展示了 HTML,其中应用了翻译指令和 jQUERY 代码,用于在调整窗口(客户端)大小时更改类。

菜单的 HTML:

<div id="navigation" ng-cloak>
    <div class="container-fluid">
        <a href="home.html" id="brand">BRAND NAME</a>

        <ul class='main-nav'>
            <li ng-class="{'active':activeLink == 'home'}">
                <a href="#/">
                    <span>Home</span>
                </a>
            </li>
            <li ng-class="{'active':activeLink == 'planning'}" data-trigger="hover">
                <a href="#" data-toggle="dropdown" class='dropdown-toggle'>
                    <span>Planning</span>
                    <span class="caret"></span>
                </a>
                <ul class="dropdown-menu">
                        <a href="#" data-toggle="dropdown" class='dropdown-toggle'>Goals</a>
                        <ul class="dropdown-menu">
                            <li>
                                <a href="#/goals/listview">{{'TOP_MENU.GOAL_LIST' | translate}}</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</div>

这里是 JQuery 代码,可以响应屏幕尺寸的变化。

function checkLeftNav() {
var $w = $(window),
    $content = $("#content"),
    $left = $("#left");
if ($w.width() <= 840) {
    if (!$left.hasClass("mobile-show")) {
        $left.hide();
        $("#main").css("margin-left", 0);
    }
    if ($(".toggle-mobile").length == 0) {
        $("#navigation .user").after('<a href="#" class="toggle-mobile"><i class="fa fa-bars"></i></a>');
    }

    if ($(".mobile-nav").length == 0) {
        createSubNav();
    }

} else {
    if (!$left.is(":visible") && !$left.hasClass("forced-hide") && !$("#content").hasClass("nav-hidden")) {
        $left.show();
        $("#main").css("margin-left", $left.width());
    }

    $(".toggle-mobile").remove();
    $(".mobile-nav").removeClass("open");

    if ($content.hasClass("forced-fixed")) {
        $content.removeClass("nav-fixed");
        $("#navigation").removeClass("navbar-fixed-top");
    }

    if ($w.width() < 1200) {
        if ($("#navigation .container").length > 0) {
            versionFluid();
            $('body').addClass("forced-fluid");
        }
    } else {
        if ($('body').hasClass("forced-fluid")) {
            versionFixed();
        }
    }
  }
}

现在,我的解决方案是获取 jquery 正在应用类的导航元素范围,并在其范围内调用 $apply()。这是行不通的。

解决方案代码:

$(window).resize(function(e) {
checkLeftNav();
// get the scope of element and apply $apply()
var sc = angular.element('.mobile-nav').scope();
sc.$apply();

});

但是当屏幕尺寸更改为小于 840 的移动 View 时,我仍然可以看到直接代码值而不是像这样在菜单中翻译的文本。当我改回屏幕宽度超过 840 时,它会显示正确的翻译文本。我正在通过调整大小在我的电脑上的 chrome 上对此进行试验。我在移动设备上检查过它也没有翻译。

enter image description here

最佳答案

AngularJS 提供双向数据 绑定(bind),而不是双向一切 绑定(bind)。它不打算以这种方式使用。 $apply() 只查看数据模型——当你想说“嘿,Angular,我已经更新了数据模型,来看看吧!”时,它是你调用的函数。这实际上是它的唯一目的。 Angular 中没有设计用于查看 DOM 本身的更改的方法 - 这是非常低效的并且无论如何都违背了 Angular 的哲学,这就是它在没有 jQuery 的情况下发布的原因。

您可能想要评估能更好地支持此类事情的其他框架。然而,如果你真的想这样做,你可以很容易地将它转换成一个合适的 AngularJS 模块。最好的方法是简单地将所有这些代码粘贴到一个 Controller 中,然后更改窗口大小调整绑定(bind)以使用 Angular 的 $window 服务,例如:

var windowElement = angular.element($window);
windowElement.bind('resize', function() {
    // Do my calculations here.
});

在您的计算中,您会计算相同的变量,但您会将它们存储在范围变量中,然后调整您的模板以使用它们。例如,您对 $(".toggle-mobile").remove(); 所做的操作可以替换为:

if (windowElement.width > 840) {
    // Other code here
    $scope.isMobile = false;
} else {
    $scope.isMobile = false;
}

在你的模板中:

<a href="#" class="toggle-mobile" ng-if="isMobile" ng-click="toggleMobile();"><i class="fa fa-bars"></i></a>

试一试,玩一两周,您将永远不会回到 jQuery。这需要很多时间来适应,但一旦你习惯了,你就会意识到整个“我正在查看我的模板,但不知道所有这些东西都绑定(bind)了哪些神秘的事件处理程序”的概念是多么糟糕。

关于css - 当我使用 jquery 更改 div 类时,AngularJs 翻译指令停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25460052/

相关文章:

html - 未调用媒体查询

javascript - 如何禁用图像拖动效果?

javascript - 如何在 Onsen UI 中从一个页面导航到另一个页面

css - 在 Bootstrap 中完全居中表单

css - 需要一个 CSS 3 列布局 fixed-fluid-fluid

html - 使用 css 对输入框进行内部发光

javascript - AngularJS - ng-repeat 出现问题

angularjs - 如何使用 AngularJS 服务依赖项对 Angular 服务进行单元测试

css 响应式设计 - 在 div 外部流动的链接

html - 如何在桌面上隐藏自定义背景(超过 992px 宽度)