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

如何为自定义指令实现ng-change

尹晟
2023-03-14
问题内容

我有一个带有模板的指令

<div>
    <div ng-repeat="item in items" ng-click="updateModel(item)">
<div>

我的指令声明为:

return {
    templateUrl: '...',
    restrict: 'E',
    require: '^ngModel',
    scope: {
        items: '=',
        ngModel: '=',
        ngChange: '&'
    },
    link: function postLink(scope, element, attrs) 
    {
        scope.updateModel = function(item)
        {
             scope.ngModel = item;
             scope.ngChange();
        }
    }
}

我想ng-change在单击某个项目并且其值foo已经更改时调用。

也就是说,如果我的指令实现为:

<my-directive items=items ng-model="foo" ng-change="bar(foo)"></my-directive>

我希望bar在的值foo已更新时致电。

使用上面给出的代码,ngChange可以成功调用,但是将使用旧值foo而不是新的更新值来调用它。

解决该问题的一种方法是ngChange在超时值内部调用超时,以在将来某个时刻执行该超时foo。但是这种解决方案使我无法控制应该执行的顺序,并且我认为应该有一个更优雅的解决方案。

我也可以foo在父级作用域中使用观察程序,但是此解决方案并没有真正实现该ngChange方法,并且有人告诉我观察程序是内存消耗大的用户。

有没有一种方法可以使ngChange同步执行而没有超时或观察者?

示例:http://plnkr.co/edit/8H6QDO8OYiOyOx8efhyJ?p
= preview


问题答案:

如果你需要ngModel,你可以叫$setViewValuengModelController,它隐评估ng- change。链接功能的第四个参数应该是ngModelCtrl。以下代码将对ng-change您的指令起作用。

link : function(scope, element, attrs, ngModelCtrl){
    scope.updateModel = function(item) {
        ngModelCtrl.$setViewValue(item);
    }
}

为了使您的解决方案起作用,请从myDirective的孤立范围中删除ngChange和ngModel。

这是一个小问题:http
://plnkr.co/edit/UefUzOo88MwOMkpgeX07?
p=
preview



 类似资料:
  • 创建自定义指令 第一步,创建一个自定义命令类文件,新建application/common/command/Hello.php <?php namespace app\common\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\con

  • 自定义指令可以使用 macro 指令来定义, 这是模板设计者所关心的内容。 Java程序员若不想在模板中实现定义指令,而是在Java语言中实现指令的定义, 这时可以使用 freemarker.template.TemplateDirectiveModel 类来扩展 (请参考 后续章节)。 基本内容 宏是有一个变量名的模板片段。可以在模板中使用宏作为自定义指令, 这样就能进行重复性的工作。例如,创建

  • 问题内容: 我收到此错误: sum()得到了意外的关键字参数’out’ 当我运行此代码时: 除了对批处理进行循环并编辑源代码之外,是否可以实现自定义指标? 问题答案: 问题是,并没有与NumPy阵列但无论哪种Theano或TensorFlow张量。这就是为什么您会收到此错误。 您可以定义自定义指标,但必须记住,其参数是那些张量,而不是NumPy数组。

  • 主要内容:实例,实例,钩子,实例,实例除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例 <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> // 注册一个全局自定义指令 v-focus Vue.d

  • 主要内容:实例,实例,钩子,实例,实例,实例除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例 <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> const app = Vue.createApp({}

  • 简介 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样: Vue.directive('focus', { inserted: function (el)