javascript - 在 AngularJS 中,$scope 如何传递到作用域?

标签 javascript angularjs

我对 Controller 中的 $scope 和指令中的 scope 的使用有点困惑。请验证我的理解是否正确(并提供一些替代方法)。

假设我有一个 html:

<div ng-controller="app1_Ctrl">
    .
    .
    .
    <input type="text" ng-model="value"/>
    <input type="checkbox" />
    <button ng-click="submit()"></button>

</div>

还有我的 main.js

(function() {

   angular.module('mainApp', ['app1']);

})();

我的 app1 看起来像这样(基于官方 AngularJS 文档 here )

(function() {

    var app = angular.module('app1', []);

    app.controller('app1_Ctrl', ["$scope", function($scope) {
        .
        .
        .
    }]);

    app.directive('app1_Dir1', [function() {

        function link(scope, element, attr) {

            scope.$watch(attr.someAttrOfCheckBox, function() {
                // some logic here
            });

            function submit() {
                // some logic here
            }


        }

        return link;

     }]);

})();

$scope.value 如何在指令范围内传递,以便我可以在那里进行一些操作? ng-click 会触发指令链接中的函数 Submit() 吗?使用scope.$watch 监听复选框元素中的操作(当然是勾选或未勾选)是否正确?

非常感谢那些能解释的人。

最佳答案

默认情况下,指令范围是 Controller $scope;但这意味着该指令直接依赖于您的 Controller ,并且您需要为要使用的指令的每个实例使用不同的 Controller 。通常认为最好的做法是隔离指令范围并专门定义您希望从 Controller 传递的变量。 为此,您需要在指令中添加范围声明:

scope {
   label :'@',
   context : '=',
   function : '&'
}

并更新您的观点:

<my-directive label="labelFromController" context="ctxtFromController" function="myFunction()" ></my-directive>

这些符号表示您希望传递的内容:@ 用于单向绑定(bind)(作为指令中的字符串),= 用于两种绑定(bind)-way 对象绑定(bind)(使指令能够更新 Controller 中的某些内容),& 用于传递函数。 还有很多其他选项和微妙之处,Angular 文档 https://docs.angularjs.org/guide/directive 对此做了最好的解释。 。还有一些不错的教程(例如 http://www.sitepoint.com/practical-guide-angularjs-directives/ )

  • 您的submit() 函数未附加到任何内容,因此您将无法从查看器中调用if。如果您想访问它,您需要在链接函数中将其定义为 scope.submit = function() ...
  • 你可以使用 $watch 来做这种事情,但是通常还有其他更优雅的方法来实现这一点,通过利用 Angular 已经“监视”它所知道的变量并监视他可以监视的任何更改(这可以例如,当某些外部服务更改数据时,这会成为一个问题,因为 Angular 无法监听它不知道的事件)。在这里,您可以简单地将 ng-model 指令关联到输入复选框以存储其 true/fale(选中/未选中)值,并使用 ng-change 或 ng-click 指令对其进行操作。最佳解决方案主要取决于您的业务逻辑的确切性质。

一些额外的想法:

  • 指令的 HTML 内部应打包在内联 template 字段中,或者打包在指令中的 templateUrl 字段引用的单独 HTML 文件中。
  • 在上面的 HTML 代码中,您的指令没有在任何地方引用。它应该是一个元素、属性或类(并且您的指令定义应该反射(reflect)使用 restrict 字段调用它的方式)。也许您省略了包含指令 HTML 的行,但就目前情况而言,您的指令不会执行任何操作。
  • 据我所知,您不需要返回链接。将其视为指令的“主体”,您可以在其中定义将在 HTML 中调用的变量和函数。
  • 您的指令实际上并不需要 HTML 代码,如果您朝不同的方向前进,上述想法可能无关紧要,但封装您想要重用的某种 View 行为可能是指令最常见的用法。

关于javascript - 在 AngularJS 中,$scope 如何传递到作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202667/

相关文章:

javascript - 如何删除d3饼图

AngularJS - 错误 : [$rootscope:infdig] 10 $digest() iterations reached

javascript - 在这种情况下如何修复自动关闭 div 标签

javascript - 实现通用的实时协作编辑器/插件(如 Google Docs)

javascript - Bootstrap : Text navbar-text wrong color

javascript - xsl :attribute with condition and handlebars

html - 在 Angular Material 网格中缩放图像

javascript - Bootstrap 表 : sort by date field

html - AngularJS - 占位符值自动更改

javascript - 预期的 spy 日志已被调用