4

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

  1. 为什么scope[attrs.ngModel]是存在的,但ngModel.$modelValue不 存在于$应用阶段?
  2. 为什么在$摘要阶段不能总是更新视图(特别是在困难的情况下)?
  3. 是$摘要阶段本地$摘要()或$根。$ digest()(从$ apply())在我的例子?
require: '?ngModel', 
link: function(scope, element, attrs, ngModel) { 

    element.bind('myEvent', function(e) {   
    //Update model from directive in phase:    $apply | $digest 

    scope[attrs.ngModel].value = scope.$$phase; //Model: '$apply' | '$digest' 
    //or 
    ngModel.$modelValue.value = scope.$$phase; //Model: 'none' | '$digest' 
    //or 
    ngModel.$modelValue.value = scope.$$phase; //Model: ''  | '$digest' 
    ngModel.$setViewValue(ngModel.$modelValue); 
    }); 
} 

现场演示:http://plnkr.co/edit/gVY6GJejEKCLdTIXNAzK?p=preview

回答

2
  1. 那是因为角一点儿也不知道如何将模型的DIV元素映射。对于几乎所有INPUT(INPUT类型文件除外),SELECT和TEXTAREA元素,angular都具有内置模型实现。 在你的情况下(一个具有应用ng模型的DIV),没有与角度已知的匹配模型适配器。 DIV元素的属性/属性应该与角色同步吗?那就是为什么你没有应用$ modelValue。 你需要做的是提供一个自定义模型适配器角度或你需要使用INPUT,SELECT或TEXTAREA元素。

  2. 因为在$摘要阶段角假定所有更改都已完成。

  3. 没有本地或全球$消化阶段。阶段总是与您的ng-app相关联。

+0

如何创建并提供自定义模型适配器?或者建议请合适的文章。 如果角度假定所有更改都已完成,我如何在$摘要阶段更改模型?现在我使用范围。$$阶段||范围。$ apply,但这是一种糟糕的方式,我认为... – tamtakoe

+1

我确定你的代码示例和问题不能反映你真正的问题。你在代码中做什么......几乎是错误的,无论如何你想要做什么,我很抱歉地说,真的:-)如果你想保持你的代码“按原样”,你唯一的选择是检查当前阶段,如果它不是“$ apply”:将你的值设置器包含在作用域中$ apply(function(){scope [attrs.ngModel] .value =“你想要的任何内容”;})重新开始应用一个新值。但正如我所说 - 你应该重新思考你的示例代码,以显示你*真正想要的*。 – lgersman