【问题标题】:Change the ngModel value from a directive [duplicate]从指令中更改 ngModel 值[重复]
【发布时间】:2014-08-10 09:36:46
【问题描述】:

我正在使用 AngularJS,我创建了一个需要 'ngModel' 的指令:

'use strict';
angular.module('spot.im.embed').directive('sayBox', ['$sce', '$timeout', '$parse',
    function($sce, $timeout, $parse) {
        return {
            restrict: 'EA',
            require: 'ngModel',
            scope: {
            },
            link: function(scope, iElement, iAttrs, ngModel) {
                ngModel.$viewValue = 'adasd';
            }
        }
    }
]);

由于我不知道的原因,ng-model 更改不会影响视图。这是为什么?这是从指令更改 ngModel 值的正确方法吗?

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    $viewValue 是属性,$setViewValue 是您可能正在寻找的方法

    link: function (scope, iElement, iAttrs, ngModel) {
        ngModel.$setViewValue('adasd');
        ngModel.$render(); // depends – if you want update input value or only model value in the scope
    }
    

    $setViewValue(value, trigger);

    当输入指令想要改变视图值时,应该调用这个方法;通常,这是在 DOM 事件处理程序中完成的。

    文档:https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

    【讨论】:

    • 我应该自己调用 $render() 吗?为什么 ngModel 不调用 $render?
    • 是的,你应该调用$render(),尝试运行代码jsfiddle.net/krzysztof_safjanowski/e00jdrsd。如果没有更多上下文,我很难写出任何建议。您要解决什么问题?
    【解决方案2】:

    它不会影响视图,因为$viewValue 在显示之前会在下一个摘要周期更新。

    如果您需要更改视图值而不触及模型值 - 您可以使用 NgModelController 中的 $formatters$parsers 从视图值 (ngModel controller documentation) 更新模型值。

    link: function(scope, iElement, iAttrs, ngModel) {
      ngModel.$formatters.push(function(value){
        return 'adasd';
      });
    }
    

    http://plnkr.co/edit/gZslSeVa2Frq0edEbuWK?p=preview


    UPD:

    如果您需要直接更新模型值(不仅仅是用于显示或解析用户输入的格式值),您可以使用 $setViewValue(正如 Krzysztof Safjanowski 回答中提到的那样)。

    修改模型值的其他方法是对隔离范围使用数据绑定:

    scope: {
        ngModel:'='
    },
    link: function(scope, iElement, iAttrs, ngModel) {
      scope.ngModel= 'adasd';
    }
    

    http://plnkr.co/edit/l9kEU03OwI03uVUc6AQ0?p=preview

    如果您不使用隔离范围,也可以使用$parse 服务更新模型值:

     link: function(scope, iElement, iAttrs, ngModel) {
       $parse(iAttrs.ngModel).assign(scope, 'adasd');
     }
    

    http://plnkr.co/edit/BDsaBxqgs9kJjnj8TsSz?p=preview

    【讨论】:

    • 格式化程序不会更新值。他们告诉如何格式化它。
    • @Naor 使用从指令更改模型值的方法更新了答案
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2016-08-10
    • 1970-01-01
    • 2016-10-02
    • 2015-10-18
    • 2014-05-03
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多