2013-02-27 3 views
1

Я пытаюсь понять привязку данных в Angularjs.Связывание данных между страницами в Angularjs

Что я хочу сделать, это установить привязку между страницами, если я изменил вход на first.html, данные должны автоматически меняться во втором .html.

Например, Это first.html:

<div ng-controller="MyCtrl"> 
    <input type="text" ng-model="value"/><br> 

    {{value}} 

<a href="#/second"><input type="submit" value="Second page"/></a> 
</div> 

и сказать second.html только этот кусок кода {{значение}}.

и в файле .js у нас есть $ routeProvider, который принимает шаблон url как 'second.html' & Контроллер - это 'MyCtrl'.

Так контроллер:

MyApp.controller(function($scope){ 

$scope.value="somevalue"; 

}) 

Делая выше способ {{значение}} на second.html является получение значения "SomeValue". Что происходит от контроллера.

Но если я изменяю динамическое значение ввода, которое находится на first.html, значение на second.html не получает это значение.

Мой вопрос в том, как я могу привязать значение на second.html с first.html автоматически.

Чтобы понять вопрос ясно, Предположим, есть введенное поле ввода текста и кнопка отправки на first.html, затем я хочу получить значение ввода текстового поля first.html на second.html на странице Отправить.

+0

Просьба предоставить ссылку Plunker или jsFiddle. – Stewie

ответ

1

Если вы приложите свои данные $ rootScope если выживут переходы между контроллерами и быть частью всех $ областей (прототип наследование магии)

//**attach in controller1:** 
function MyCtrl1($rootScope) { 
    $rootScope.recs= { rec1 : "think philosophically" }; 
} 

//**do nothing in controller for view2:** 
function MyCtrl2($scope) { 
    //nothing 
} 

//**Markup for view2: automaticall makes use of data in $routeScope** 
<p>Try doing this: {{recs.rec1 }}</p> 

//**markup for view1 to respond to OPs question in comments**: 
<input ng-model="recs.rec1" /> 

Обновление: Создание таможенной службы является более масштабируемым и структурно звуком способ справиться с этим, но метод $ rootScope является быстрым и грязным способом.

Update2: добавлена ​​разметка view1 для ответа на вопрос OP, отредактированный пример, чтобы использовать правильные советы для использования объекта, а не примитивного.

+0

Если нам нужно вводить значения динамически (скажем, из ввода на первом представлении), это не работает (я имею в виду привязку на втором представлении). Что делать для достижения этого. – user1586243

+1

См. Обновление выше. Ваша двусторонняя привязка не работает из-за примитива. если вы * нужны *, чтобы просто иметь строку по какой-либо причине, вы можете использовать прослушиватель событий и сбросить объект области действия onEvent, но обертка объектов почти наверняка будет лучше. – Jason

+0

Позвольте мне объяснить, что я ищу, Предположим, есть поле ввода для ввода текста и кнопка отправки на first.html, затем я хочу получить значение ввода текстового поля first.html на втором .html на странице Отправить. – user1586243

3

Используйте сервис и сохраните свою модель. У Gloopy уже есть хороший пример этого: https://stackoverflow.com/a/12009408/215945
Обязательно используйте свойство объекта вместо примитивного типа.

Если вы не хотите использовать $ rootScope, то, как указано выше, определить объект, а не примитивное:

$rootScope.obj = { prop1: "somevalue" }` 

затем привязать к этому свойству объекта в ваших просмотров:

<input type="text" ng-model="obj.prop1"> 
{{obj.prop1}} 
+0

Позвольте мне объяснить, что я ищу, Предположим, что есть вводное поле для ввода текста и кнопка отправки на first.html, тогда я хочу получить значение ввода текстового поля first.html на втором .html на странице Отправить. Поэтому всякий раз, когда ввод на first.html изменяет значение в second.html, нужно получить это значение. – user1586243

+0

То, что я описал, будет работать, если только «отправить» означает, что вы не используете Угловую маршрутизацию, и браузер получает новую страницу с веб-сервера. В этом случае Angular не может помочь вам в этом, потому что вы перезагружаете Angular на second.html. –

+0

Под «submit» я имею в виду, используя $ rootProvider от Angular, идущий на следующую страницу, например ** $ routeProvider.when ('/ second', { templateUrl: "second.html", Контроллер: "MyCtrl" }) ** и присвоение «/ second» на ** **. – user1586243

0

Вы должны использовать $ broadcast, $ emit или scope. Старайтесь не перегружать rootScope.Это плохая практика как сохранение данных в сеансах приложений.

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