Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用ng模型绑定时保留自定义对象类型_Javascript_Angularjs_Angularjs Ng Model - Fatal编程技术网

Javascript 使用ng模型绑定时保留自定义对象类型

Javascript 使用ng模型绑定时保留自定义对象类型,javascript,angularjs,angularjs-ng-model,Javascript,Angularjs,Angularjs Ng Model,我有一系列自定义javascript对象,它们扩展了基本数组。这些对象由数据工厂接收和处理,以供主表单控制器使用 当绑定到任意输入类型(复选框、单选框、选择)时,初始绑定在加载时是正常的,数据显示和工作正常。但是,在更新视图中的值时,自定义对象类型将被覆盖并替换为基数组 当将数据发送回数据工厂时,我需要知道它是什么类型(有几种),以便确定如何为SharePoint列表格式化它。有什么方法可以保留我的对象类型并仍然允许双向绑定吗?当输入通过ngModel更新模型时,它通常使用覆盖模型初始值的值

我有一系列自定义javascript对象,它们扩展了基本数组。这些对象由数据工厂接收和处理,以供主表单控制器使用

当绑定到任意输入类型(复选框、单选框、选择)时,初始绑定在加载时是正常的,数据显示和工作正常。但是,在更新视图中的值时,自定义对象类型将被覆盖并替换为基数组


当将数据发送回数据工厂时,我需要知道它是什么类型(有几种),以便确定如何为SharePoint列表格式化它。有什么方法可以保留我的对象类型并仍然允许双向绑定吗?

当输入通过ngModel更新模型时,它通常使用覆盖模型初始值的值来更新它,并且可能是另一种类型

有时,您可以选择具有内置属性的返回值,例如复选框的ng true value和ng false value或ng选项“数组中值的标签”

如果您不能这样做或者需要一个更可重用的解决方案,您可以使用ngModel格式化程序和解析器

某些后台模型实际上包含两个值:

  • $modelValue—作用域属性在ngModel中使用的实际数据 表达式保持不变-例如在
    ng model=“variable”
    中-$modelValue将保持不变 来自变量的那个
  • $viewValue—输入控件中使用的值—例如,用户看到的文本框中的文本
通常$modelValue和$viewValue是相同的,但是我们可以选择使用$formatters和$parsers管道来更改它们

$formatters是我们可以将函数推送到的管道。当$modelValue更改时(即绑定的属性更改),数据将由管道中的函数转换,结果将是$viewValue

$parsers是相反的管道。每当视图值发生更改时,例如,有人将文本输入到输入中,$viewValue将使用$parsers管道转换为模型值

底线-您可以将自定义对象($modelValue)转换为输入控件($viewValue)中使用的数据,然后使用这两个管道返回。为此,您需要创建一个简单的指令,并向管道(数组)添加您喜欢的任何转换器(函数)。例如(-打开控制台并单击复选框):

定制原型:

  function CustomObj(value) {
    this.value = !!value ? 'cats' : 'dogs';
  }

  CustomObj.prototype.getValue = function getValue() {
    return this.value;
  };
控制器:

    .controller('ExampleController', ['$scope', function($scope) {

      $scope.checkboxModel = {
        value1: new CustomObj(true) // the model is an instance of CustomObj
      };
    }])
管道指令:

    .directive('preserveCustom', function() {
      var ddo = {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, el, attrs, ngModel) {

          function formatter(modelValue) {
            if(modelValue instanceof CustomObj) {
              return modelValue.getValue() === 'cats';
            }

            return value;
          }

          function parser(viewValue) {
            return new CustomObj(viewValue);
          }

          ngModel.$formatters.push(formatter);
          ngModel.$parsers.push(parser);
        }
      }

      return ddo;
    });
以及html:

<input type="checkbox" ng-model="checkboxModel.value1" preserve-custom>


Controller code+HTML很好。我通过绑定到对象的属性而不是对象本身,实现了一个类似问题的相对简单的解决方案:
ng model=“view.customObjectInstance.data”
这样,当双向绑定发生时,angular不会丢弃
CustomObject
保留您可能已经拥有的任何属性或函数。这正是我所需要的,让我走上正确的方向。谢谢我很高兴能为您提供帮助。如果您说“结果将是$modelValue”,我猜您的意思是“结果将是$viewValue”?@abl-确实如此。谢谢