2015-03-17 5 views
5

Я деактивирую некоторый виджет, и выражение $watch прекрасно работает со всеми в одном файле, но теперь я переместил соответствующую часть контроллера в новый контроллер, а разметка в новый html и $watch срабатывает ровно один раз после инициализации, но не тогда, когда редактирование ввода в соответствующем входе.

JS:

app.controller('getRecipientWidgetController', [ '$scope', function($scope) { 
    console.log("controller initializing") 
    var testReceivingAddress = function(input) { 
     console.log("change detected") 
    } 
    $scope.$watch("addressInput", testReceivingAddress) 
} ]) 

HTML обертки:

<ng-include 
    src="'partials/getRecipientWidget.html'" 
    ng-controller="getRecipientWidgetController" 
    ng-init="recipient=cert"> <!-- ng-init doesn't influence the bug. --> 
</ng-include> 

HTML из partials/getRecipientWidget.html:

<md-text-float ng-model="addressInput"></md-text-float> 

Я подозреваю, что есть некоторые возможности вуду происходит? Я оставил ng-init, чтобы уточнить, чего я хочу достичь: построить явно более сложный, многоразовый виджет, который в этом случае будет работать на $scope.cert как его recipient.

+0

Просто для смеха, что происходит, когда вы впрыскивать rootscope и вызвать $ смотреть на это? – lintmouse

+0

@dustmouse без изменений. Точно такая же ошибка/поведение. – Giszmo

+0

Как сказал флорибон в своем ответе, узнайте о так называемом «правиле точки». – Blackhole

ответ

7

Это, вероятно, потому, что ng-include создаст новую унаследованную сферу на прилежащей HTML, следовательно, $scope.addressInput в контроллере не та же ссылка, как $scope.addressInput в getRecipientWidget.html

Ну это не так легко объяснить, но вы должны либо поместить ng-controller в HTML-формате getRecipientWidget.html (а не на div выше, который включает его), или вы можете использовать объект, такой как something.addressInput, вместо необработанного addressInput, который позволяет избежать проблем с ссылками на типы raw (число/строка).

+0

Да! Спасибо, тонна! «что-то» начал работать здесь. :) Не уверен, какие из ваших решений выбрать, но с выбором лучше справиться, чем с моей ошибкой :) – Giszmo

+0

Выберите вторую. Использование точечной нотации рассматривается как лучшая практика в AngularJS, и это последовательно означает, что вы не будете иметь эту ошибку, чтобы укусить вас (или ваш коллега, который изменит HTML) – Greg

+0

Я только что проверил первый и (вы можете уточнить/добавить это к своему ответу), что оба контроллера закончили работу в той же области. Пойдет с «чем-то» и двумя областями (?). – Giszmo

3

ng-include создает новый объем.

Попробуйте

<md-text-float ng-model="$parent.addressInput"></md-text-float> 

Plunker example

+0

Спасибо, но я думаю, что флорибон неплохо справился с объяснением что происходит. Вероятно, использование '$ parent' будет третьим вариантом. – Giszmo

Смежные вопросы