【问题标题】:Get AngularJS to play nice with other javascript让 AngularJS 与其他 javascript 一起玩得很好
【发布时间】:2013-10-23 07:53:31
【问题描述】:

我已经开始使用 AngularJS 和一些已经编写好的代码,需要让它一起玩得很好。

所以我有

<html ng-app="MainPage">
<head>
...Some JS includes
</head>
<body>
    <div id="divDropDownMenu" class="DropDownMenu">
      ....AngularJS stuff in here
    </div>
</body>

我正在使用此代码在“divDropDownMenu”末尾附加一个按钮,并在单击该按钮时向上和向下滑动以显示菜单项。

var divPanel = $("<div class='slide-panel'>");
var divContent = $("<div class='content'>");
(function ($, $scope) {

$.fn.slideBox = function(params){

    var content = $(this).html();
    var defaults = {
        width: "100%",
        height: "500px",
        position: "top"         // Possible values : "top",     "bottom"
    }

    // extending the function
    if(params) $.extend(defaults, params);



    $(divContent).html(content);
    $(divPanel).addClass(defaults.position);
    $(divPanel).css("width", defaults.width);

    // centering the slide panel
    $(divPanel).css("left", (100 - parseInt(defaults.width))/2 + "%");

    // if position is top we're adding 
    if(defaults.position == "top")
        $(divPanel).append($(divContent));

    // adding buttons
    $(divPanel).append("<div class='slide-button'>Open Menu</div>");
    $(divPanel).append("<div style='display: none' id='close-button'     class='slide-button'>Close Menu</div>");

    if(defaults.position == "bottom")
        $(divPanel).append($(divContent));

    //$(this).replaceWith($(divPanel));

    // Buttons action
    $(".slide-button").click(function(){
        if($(this).attr("id") == "close-button")
            $(divContent).animate({height: "0px"}, 1000);
        else
            $(divContent).animate({height: defaults.height}, 1000);

        $(".slide-button").toggle();
    });
};

})(jQuery);
function SlidePanelExpandCollapse(ExpandCollapse)
{
if (ExpandCollapse == "Expand") {
    $(divContent).animate({ height: defaults.height }, 1000);
}
else {
    $(divContent).animate({ height: "0px" }, 1000);
}
$(".slide-button").toggle();

}

问题是使用上述代码时,目标 div 内的任何角度都不会触发。


这是上面 JS 菜单滑块的 CSS

/* @override 
http://samuelgarneau.com/slidebox.css
http://samuelgarneau.com/lab/validator/slidebox.css
http://samuelgarneau.com/lab/slidebox.css
http://samuelgarneau.com/lab/slidebox/style/slidebox.css
*/

body {
margin: 0;
padding: 75px 0 0;
}

.slide-panel {
z-index: 9999;
width: 5px;
position:absolute;
}

.bottom {
bottom: 0;
}

.right {
}

.left {
position: absolute;
left: 0;
}

.top {
top: 0;
}

.content {
margin-left: auto;
margin-right: auto;
z-index: 10;
overflow: hidden;
text-align: left;
background-color: #343434;
height: 0;
width: 100%;
color: #fff;
}

.slide-button {
background: none repeat scroll 0 0 gray;
margin-left: auto;
margin-right: auto;
position:relative;
width: 150px;
z-index: 20;
cursor: pointer;
height: 30px;
padding-top: 10px;
text-align: center;
}

.slide-button:hover {
color: #ffffff;
}

【问题讨论】:

标签: javascript jquery css angularjs


【解决方案1】:

我在您的示例中根本没有看到 AngularJS 的任何实际用途。唯一让我想起 AngularJS 的是在你的函数定义中提到了$scope。现在,虽然 AngularJS 在某些领域看起来很神奇,但它仍然无济于事。

此外,保留现有代码并仅添加一些 AngularJS 部分似乎很诱人。但是,看到您的示例,我建议您使用 AngularJS 的方式重写此功能。使用ng:hideng:show 可以轻松地显示和隐藏内容。你做的动画可以用ng:animate来完成。如果您需要动态显示数据,请将其放入模型(在您的范围内)并与 ng:repeat 等函数一起使用。

您在示例中所做的似乎使用 AngularJS 功能可以归结为仅几行代码,因此结果会更好,更易于阅读和维护。帮自己一个忙,熟悉 AngularJS 可以为您提供什么,并停止为直接 DOM 操作而烦恼。这是一个糟糕的模式。 DOM 操作令人讨厌、复杂且容易崩溃。它通常也是一个无法维护的混乱。最好的:如果你仍然在使用 AngularJS,那么它完全是多余的,因为通过在 HTML 中使用触发条件逻辑的模型,一切都可以更容易地实现。

来自 AngularJS 创建者在 Google I/O 2013 上的谈话中的一些令人印象深刻的事实:他在一开始就使用 AngularJS 重写了 Google 的一个内部项目。结果是14000行代码减少到1500行。

我承认这并不能真正算作你问题的答案,但我真的相信你最好立即停止这种方法,而不是浪费时间在 AngularJS 中重写它。即使您仍然必须阅读所有详细信息,这也不会超过半小时。

编辑/附录: 我提到的演讲是“Google I/O 2013 - AngularJS 中的设计决策”http://www.youtube.com/watch?v=HCR7i5F5L8c 我强烈建议即使已经使用过 AngularJS 的人也可以观看此视频.它对 AngularJS 的方式提供了很好的洞察力,当试图说服其他人尝试 AngularJS 时,它的观点会派上用场:)

Edit/Addendum2: 正如上面提到的 Sprottenwels 有用的那样,stackoverflow 上还有另一个问题,它对我上面总结的内容进行了更彻底的解释,所以请阅读:@987654322 @

Edit/Addendum3: Sprottenwels 再次提到:http://www.egghead.io/lessons 的视频是一个很好的资源。我个人发现它们有时有点难以理解(你可能需要停止视频并阅读 AngularJS 的文档,幸好现在比以前好多了)。

哦,就个人而言:虽然我从 1997 年左右开始从事 Web 开发,但我从来都不是在 JavaScript 中做应用程序之类的东西的朋友,因为所有这些框架都非常复杂,有很多样板文件,而你正在做的事情感觉就像浪费时间。 AngularJS 确实对我做这些事情的动机产生了奇迹,因为它最终完全合乎逻辑,而且它神奇的内部运作方式让我完全摆脱了我讨厌的事情,比如数据和视图的同步。

我非常感谢 AngularJS 人员,我绝对相信这是进行 Web 应用程序编程的唯一真正未来。现在 AngularJS 在性能方面可能会出现问题,因为它会做诸如脏检查之类的“坏”事情,但是随着 Object.observe 等新的浏览器功能的出现,这种情况将会改变。所以我真的认为选择充分使用 AngularJS 是一个明智且未来安全的举措。

【讨论】:

  • Full ACK 我发现严格删除我项目的所有 jQuery 代码很容易,然后用 Angular 做所有事情。熟悉框架后,如果仍然需要,仍然可以再次添加 jQuery
  • 这很专业地回答了实际问题。
  • 谢谢...我没有包含所有的 Angular 代码,我认为这对于这个问题并不重要,因为当我包含 Jquery Angular 时不起作用,而当我不包含包括它 Angular 确实有效。我开始走上重写的道路,想知道是否有一种简单的方法可以传递 $scope。我认为你是对的,从长远来看,我最好还是重写它。谢谢。我有一些更好的例子来说明如何做这样的事情。
  • @TJunky 我强烈推荐 www.egghead.io/lessons 作为学习资源 :)
  • 嗯,真的没那么难。确定 jQuery-Code 实际在做什么/打算做什么,然后看看如何在 AngularJS 中做到这一点。例如,显示/隐藏内容可以归结为将 $scope.flag 之类的内容绑定到 ng:view,然后在您想要显示内容时将 $scope.flag 设置为 true。在jQuery中设置一个类?将ng:class 与另一个范围变量一起使用。动画?基本上是免费的(在 Angular 1.2 中),您可能只需要设置一些 CSS。 XHR?使用 $http 或 Restangular。再次:将其绑定到范围变量。在你的 HTML 中使用它。
猜你喜欢
  • 1970-01-01
  • 2014-10-02
  • 2015-05-08
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2012-11-27
相关资源
最近更新 更多