当前位置: 首页 > 面试题库 >

将Ang操作与Angular控制器分离-希望有最佳实践

仰雅昶
2023-03-14
问题内容

试图找到构建Angular App的“最佳”方法,我发现了几篇最佳实践文章。通过此输入,我做到了:

angular.module('xApp', [])
//..... some services, factories, controllers, ....

.directive('dirNotification',[ function dirNotification() {
    return {
        scope: {}, 
        templateUrl: 'xNotification.html',
        replace: true,
        controller: 'CtrlNotification',
        link: function($scope){
            // if this is 'DOM manipulation, should be done here ... ?
            /*
            $scope.$on('session.update',function(event, args) {
                if (args == null) {
                    $scope.notificationdata.username = "";
                    $scope.notificationdata.sid = "";
                } else {
                    $scope.notificationdata.username = args.username;
                    $scope.notificationdata.sid = args.accessToken;
                }
            });
            */
        }

    };
}])
.controller('CtrlNotification',['$scope' ,function CtrlNotification($scope) {

    $scope.notificationdata = {
        username: "",
        sid: ""
    };

    // this is not real DOM manipulation, but only view data manipulation?
    $scope.$on('session.update',function(event, args) {
        if (args == null) {
            $scope.notificationdata.username = "";
            $scope.notificationdata.sid = "";
        } else {
            $scope.notificationdata.username = args.username;
            $scope.notificationdata.sid = args.accessToken;
        }
    });

}])

HTML模板就是这样:

<div>
    <p>{{notificationdata.username}}</p>
    <p>{{notificationdata.sid}}</p>
</div>

所以我的问题是,是否应该将数据更改视为DOM操作?在控制器中执行此操作的当前版本对我来说似乎更实用(例如,设置默认值)。另外,如果我为此添加更多功能,则“指令链接”块将增加并且包含比定义更多的功能。我猜应该在指令中执行诸如更改颜色或根据范围数据隐藏元素之类的事情。

社区是什么意思?您是否同意我的假设?

谢谢,Rainer


问题答案:

控制器:

您不应该在控制器中进行DOM操作(或查找DOM元素,或对View进行任何假设)的原因是,因为控制器的意图是仅处理应用程序的状态-通过更改ViewModel-
无论状态如何在View中反映。该控制器通过对来自Model和View的事件做出反应并设置ViewModel的属性来实现。Angular将通过绑定处理在视图中反映应用程序的“状态”。

因此,是的,当然,更改ViewModel会导致View做出反应并操纵DOM,但想法是控制器不应该知道或关心View做出的反应如何。这样可以使关注点分离保持完整。

指令:

当内置指令是不够的,你需要了解更严格的控制 如何 查看正在反应,这是一个很好的理由来创建自定义指令。

关于指令要记住的两件事。

1)将指令视为可重用的组件很有用,因此特定于应用程序的逻辑越少越好。当然,请避免在此处使用任何业务逻辑。定义输入和输出(通常通过属性),并仅对它们作出反应。事件侦听器(就像您一样)是非常特定于应用程序的(除非该指令打算与发布事件的另一个指令一起使用),因此,如果可能的话,最好避免使用。

.directive("notification", function(){
  return {
    restrict: "A",
    scope: {
      notification: "=" // let the attribute get the data for notification, rather than
                        // use scope.$on listener
    },
    // ...
  }
})

2)仅仅因为指令“允许执行DOM操作”并不意味着您应该忘记ViewModel-View的分离。Angular允许您在链接或控制器函数中定义范围,并提供包含所有典型Angular表达式和绑定的模板。

template: '<div ng-show="showNotification">username:{{notification.username}}</div>',

// controller could also have been used here
link: function(scope, element, attrs){ 
   scope.showNotification = Math.floor(Math.random()* 2);    
}


 类似资料:
  • 问题内容: 我的应用程序中有一个基本工厂,可以处理API调用。目前,我正在使用以下形式: 在我的控制器中,我正在像这样处理诺言: 看来我可以将promise处理移至Factory,而不是在控制器中执行,但是我不确定这是否会带来比小型控制器更多的好处。 有人可以解释有关此模式的最佳做法吗? 问题答案: 最终由您自己决定要向服务调用者提供多少数据。如果需要,您可以肯定地将HTTP响应对象返回给调用者,

  • 问题内容: 这是一个现实的Angular问题,我无法解决。我喜欢Angular,但是这个问题现在困扰着我很多。 扩展现有控制器功能,并在应用程序的另一页上使用扩展控制器的最佳实践是什么?换句话说: 如何在Angular中继承控制器? 编辑 -2014年9月23日,不要以为我的原始用例的描述会帮助访问者更好地理解我在这里的用意。我认为这使人们偏离了真正的问题。 问题答案: 半年后,我想我完全了解发生

  • 提交对映改动 一次提交要包括一个相关改动。例如,对于两个错误的修复应该进行两次不同的提交。精简的提交可以让其他的开发团队人员更简单地明白其改动的用义。如果其中一次提交的改动出现了问题,也可以方便地回滚到改动之前的状态。借助暂存功能来标记相关的改动文件,Git 可以为你打造出非常精准的提交。 频繁地提交改动 经常性地提交改动可以确保不会出现特别庞大的提交,同时也可以比较精准地对应到所需要的改动上。此

  • 本文向大家介绍ASP.NET MVC中将控制器分离到类库的实现,包括了ASP.NET MVC中将控制器分离到类库的实现的使用技巧和注意事项,需要的朋友参考一下 前言   在、ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以这里不予说明,那么这时候我们就

  • CRUD代表创建,读取,更新,删除。这是四种方法(如果区分查看一个记录和查看所有记录,则是五种方法)。在Rails中,处理CRUD的规范方法似乎包括七种方法。例如,使用 速记法为Order对象创建路由会生成以下七条路由: 这就是我困惑的根源。为 和 设置单独的操作/路由有什么意义?使用单独的操作查看页面和在数据库中创建记录有什么好处?我理解它是如何在Rails中实现的,例如: 在使用Rails之前

  • 我有一个角色系统,管理员可以根据页面菜单(每个页面菜单都有自己的控制器)创建新角色并授予读取、写入、编辑和删除权限,然后将该角色分配给用户。 用户也可以有多个角色,但我已经讨论过了。我面临的唯一问题是:由于角色分配可以在应用程序中动态完成,所以我不能使用< code>[Authorize(Roles = Role。Admin)]属性。 相反,我正在考虑创建[读取],[写入],[编辑]和[删除]属性