Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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 从AngularJS中的$apply或$digest cycle指令更新模型_Javascript_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 从AngularJS中的$apply或$digest cycle指令更新模型

Javascript 从AngularJS中的$apply或$digest cycle指令更新模型,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我尝试从指令更新模型,但在$apply或$digest已在进行时遇到一些问题。我有一些问题: 为什么scope[attrs.ngModel]存在,而ngModel.$modelValue不存在 是否存在于$apply阶段 为什么视图不能总是在$digest阶段更新(特别是在困难的情况下) 在我的示例中,$digest阶段是本地$digest()还是$root.$digest()(来自$apply()) require:“?ngModel”, 链接:功能(范围、元素、属性、模型){ 元素绑定('m

我尝试从指令更新模型,但在$apply或$digest已在进行时遇到一些问题。我有一些问题:

  • 为什么
    scope[attrs.ngModel]
    存在,而
    ngModel.$modelValue
    不存在 是否存在于$apply阶段
  • 为什么视图不能总是在$digest阶段更新(特别是在困难的情况下)
  • 在我的示例中,$digest阶段是本地$digest()还是$root.$digest()(来自$apply())
  • require:“?ngModel”,
    链接:功能(范围、元素、属性、模型){
    元素绑定('myEvent',函数(e){
    //分阶段从指令更新模型:$apply |$digest
    范围[attrs.ngModel].value=scope.$$phase;//模型:“$apply”|“$digest”
    //或
    ngModel.$modelValue.value=scope.$$phase;//模型:“无”|“$digest”
    //或
    ngModel.$modelValue.value=scope.$$phase;//模型:''|'$digest'
    ngModel.$setViewValue(ngModel.$modelValue);
    });
    }
    
    现场演示:

  • 这是因为angular不知道如何将模型映射到DIV元素。angular为几乎所有输入(输入类型文件除外)、SELECT和TEXTAREA元素都内置了模型实现。 在您的情况下(应用ng模型的DIV),angular不知道匹配的模型适配器。DIV元素的哪个属性/属性应该与您的模型同步??这就是为什么没有应用$modelValue的原因。 您需要做的是为angular提供自定义模型适配器,或者需要使用INPUT、SELECT或TEXTAREA元素

  • 因为在$digest阶段,angular假设所有更改都已完成

  • 没有本地或全局$摘要阶段。阶段始终与您的ng应用程序关联


  • 如何创建和提供自定义模型适配器?或者请建议合适的物品。如果angular假设所有更改都已完成,如何在$digest阶段更改模型?现在我使用scope.$$phase | | scope.$apply,但我认为这是一种不好的方式……我确信您的代码示例和问题并没有反映您真正的问题。您在代码中所做的是。。。几乎是错误的,不管怎样,你想做什么,我很抱歉地说,真的:-)如果你想让你的代码“保持原样”,你唯一的选择就是检查当前阶段,如果它不是“$apply”:将你的值设置器包装在范围内。$apply(function(){scope[attrs.ngModel].value=“whatever you want”})重新应用一个新值。但正如我所说的,您应该重新思考您的示例代码,以显示您真正想要的。