为长篇文章道歉,但我试图提供尽可能多的信息 .
我继承了一个使用Angular的相当复杂的应用程序 . 由于NDR,我无法发布代码示例,到目前为止,无法在更小,更简单的独立plnkr中重现我的问题 . 我敢肯定,如果可以,我可以弄清楚我需要做些什么来解决这个问题 . 我知道你的双手是因为我不能发布代码,也不能在plnkr中重新创建问题,但是我会尽力提供尽可能多的信息,希望能得到一些关于下一步要看的一般建议 .
首先,代码/架构:我有一个form.html . 在form.html中,我们使用ng-repeat来迭代从数据库中提取的字段列表,并显示每个字段 . 表单级别的字段是自定义类型 .
updateField(fieldId,data)在form.directive.js中定义,用于在数据更改时将数据更新回数据库 . 这部分可靠地工作 .
form.html还包含一个用于清除字段内容的按钮 .
该字段使用模板根据类型生成正确的输入 . 我们使用选择,文本,短信和许多其他自定义字段 . 我们也在许多这些领域中使用预测文本 .
这是一个例子:
有一个field.directive.js,它有自己的方法来处理已编写的自定义输入字段 . 那包含:
scope: {
data: '=',
field: '=',
onUpdate: '='
},
问题:最初加载表单时,如果文本字段中有数据,并且用户点击“清除字段”按钮,则数据库会更新,并从文本框中删除字符串 .
当用户首先将文本键入字段时,请保留字段,ng-blur调用updateField,并将数据写入数据库 . 这很好用 . 当用户单击text或textedit字段的Clear Field按钮时,数据库中的值将设置回null,但文本框中显示的字符串不会被清除 . 但是,如果我们重新加载表单,则文本字段显示为空 .
起初我认为这与使用ng-repeat产生的领域内的孤立范围有关 . 但是,form.html顶部的attrs.field的简单输出语句显示每次更新文本框时,父作用域也会更新 . 所以这似乎不是问题 .
我已经决定问题可能是输入的$ modelValue正在更新,但$ viewValue不是(或者至少我们需要因为某种原因调用$ render) . 我一直试图将ngModel注入到form.directive.js中,以便访问这些变量和方法,看看我是否正确,但我有一段时间这样做 .
第一次尝试:我尝试将ngModel注入到form.directive.js的指令参数列表中 . 当我加载表单时,我收到以下错误:
Error: [$injector:unpr] Unknown provider: ngModelProvider
http://errors.angularjs.org/1.4.7/$injector/unpr?p0=ngModelProvider%20%3C-%20ngModel%20%3C-%20fieldsDirective
我对Angular很新,我发现链接上的信息比较混乱 . 有些人帮助理解他们所谈论的内容会很棒!
第二次尝试:将formMirel作为参数注入form.directive.js中链接字段中的函数,以及return {}部分中的require:'ngModel'语句 . 当我加载表单时,我收到以下错误:
Error: [$compile:ctreq] Controller 'ngModel', required by directive ‘fields', can't be found!
http://errors.angularjs.org/1.4.7/$compile/ctreq?p0=ngModel&p1=fields
当我按照这个链接说它正在寻找当前DOM元素或其祖先所需的指令控制器(当使用require:'^ ngModel'时) . 但是,这些在表单中使用的字段中由模板使用 . 这是否有资格以这种方式在当前DOM元素中使用?
第三次尝试:假设模板是我不能包含ngModel的原因,我发现了这个:Updating ng-model within a directive that uses a template . 我更改了数据:'='范围映射到数据:'= ngModel' . 不幸的是,这根本没有改变任何行为 .
我被卡住了 . 任何人都可以为我提供一些其他途径来探索,或者可以阐明为什么我的包括ngModel失败了吗?
提前致谢!