У меня есть директива, которая использует родительскую область в этом представлении. У этой директивы есть дочерняя директива, использующая изолированную область. Я пытаюсь заставить родительскую директиву следить за любыми изменениями, внесенными в ngModel дочерней директивы, и обновлять свой собственный модальный режим, если были внесены изменения. Вот jsfiddle, который, вероятно, объясняет лучше: http://jsfiddle.net/Alien_time/CnDKN/
Вот код:
<div ng-app="app">
<div ng-controller="MyController">
<form name="someForm">
<div this-directive ng-model="theModel"></div>
</form>
</div>
</div>
Javascript:
var app = angular.module('app', []);
app.controller('MyController', function() {
});
app.directive('thisDirective', function($compile, $timeout) {
return {
scope: false,
link: function(scope, element, attrs) {
var ngModel = attrs.ngModel;
var htmlText = '<input type="text" ng-model="'+ ngModel + '" />' +
'<div child-directive ng-model="'+ ngModel + '"></div>';
$compile(htmlText)(scope, function(_element, _scope) {
element.replaceWith(_element);
});
// Not sure how to watch changes in childDirective's ngModel ???????
}, // end link
} // end return
});
app.directive('childDirective', function($compile, $timeout) {
return {
scope: {
ngModel: '='
},
link: function(scope, element, attrs, ngModel) {
var htmlText = '<input type="text" ng-model="ngModel" />';
$compile(htmlText)(scope, function(_element, _scope) {
element.replaceWith(_element);
});
// Here the directive text field updates after some server side process
scope.ngModel = scope.dbInsertId;
scope.$watch('dbInsertId', function(newValue, oldValue) {
if (newValue)
console.log("I see a data change!"); // Delete this later
scope.ngModel = scope.imageId;
}, true);
},
} // end return
});
В примере вы можете видеть, что внутри родительской директивы есть ввод текста, а также ее дочерняя директива. Если вы введете внутри каждого из них, другая модель будет обновлена, так как они связаны ngmodel
. Однако текстовый ввод дочерней директивы обновляется после подключения к серверу. Когда это происходит, текстовый ввод в родительской директиве не обновляется. Поэтому я думаю, что мне нужно следить за ngModel внутри дочерней директивы на предмет любых изменений. Как я могу это сделать? Есть ли смысл?
timeout
в реальной связи с сервером? Я хочу, чтобы область действия обновлялась доscope.ngModel = scope.dbInsertId;
при изменении наdbInsertId
. Но когда я добавляю это внутриscope.$watch
передreturn ngModel.$modelValue;
, это не обновляет родительскую директиву. Это работает, когда я установил его в$timeout
. Что я делаю неправильно? - person Neel   schedule 03.04.2014scope.$apply()
, но не смог найти подходящего примера того, как его использовать. Первый раз сталкиваюсь сscope.$apply
. Если я не прошу слишком многого, не могли бы вы показать мне быстрый пример, пожалуйста? Мне очень жаль, что я беспокою вас. :( - person Neel   schedule 03.04.2014scope.apply()
и выдал много ошибок. Значит, я явно что-то делаю не так. - person Neel   schedule 03.04.2014