Как сохранить ссылку на активный элемент с помощью AngularJS и AngularFire?

У меня есть простое приложение для заметок, которое показывает список заметок и активную, выбранную заметку в текстовой области. Я хочу иметь возможность выбирать заметку в списке и редактировать ее.

В моем контроллере у меня есть «активная» переменная, которая указывает на элемент в списке заметок. Используя только AngularJS, это работает нормально. Если я добавлю AngularFire, активный элемент больше не будет подключен всякий раз, когда я изменяю содержимое в текстовой области. Плохо ли хранить эту активную ссылку?

Вот соответствующая часть контроллера:

var notesApp = angular.module('notesApp', ['firebase']);
function NotesCtrl($scope, angularFire) {
    var fireBaseUrl = new Firebase('https://mynotesapp.firebaseio.com/notes');
    $scope.notes = [];
    $scope.select = function (note) {
        $scope.active = note;
    };
    angularFire(fireBaseUrl, $scope, 'notes').then(function () {
        $scope.active = $scope.notes[0];
    });
}

И HTML:

<ul>
  <li ng-repeat="note in notes" ng-class="{active: note == active}">
    <a href="#" ng-click="select(note)">{{ note.title }}</a>
  </li>
</ul>
<textarea ng-model="active.body"></textarea>

Полный пример находится здесь: http://jsfiddle.net/4zsMH/.


person Frederik    schedule 07.09.2013    source источник


Ответы (1)


Поэтому, когда вы копируете выбранную заметку в $scope.active ..firebase, привязка теряется. Я немного изменил ваш код, и теперь он работает.

http://jsfiddle.net/MXUxZ/

Вид

<div ng-app="notesApp">
    <div class="container" ng-controller="NotesCtrl">
        <div class="row">
             <h1>Notes</h1>

            <ul class="note-list col-xs-3 nav nav-pills nav-stacked">
                <li ng-repeat="note in notes" ng-class="{active: selectedIndex == $index}"><a href="#" ng-click="select($index)">{{ note.title }}</a>

                </li>
                <li><a href="#" ng-click="addNote()">+ Add Note</a>

                </li>
            </ul>
            <div class="note-detail col-xs-9">
                <textarea rows="20" style="width:100%" ng-model="notes[selectedIndex].body"></textarea>
            </div>
        </div>
    </div>
</div>

Контроллер

var notesApp = angular.module('notesApp', ['firebase']);

function NotesCtrl($scope, angularFire) {
    var fireBaseUrl = new Firebase('https://notes6754.firebaseio.com/notes');
    $scope.notes = [];
    $scope.select = function (note) {
        $scope.selectedIndex = note;
    };
    $scope.addNote = function () {
        var title = prompt('Note Title');
        if (title) {
            var note = {
                title: title,
                body: 'Replace me'
            };
            $scope.notes.push(note);
            $scope.active = note;
        }
    };
    angularFire(fireBaseUrl, $scope, 'notes').then(function () {
        $scope.selectedIndex = 0;
    });
}
person skeep    schedule 08.09.2013
comment
Итак, ваше предложение состоит в том, чтобы сохранить индекс элемента в качестве ссылки? Это идиоматическое использование Angular? - person Frederik; 08.09.2013
comment
Не совсем идиоматическое использование, но ключ в том, что firebase не будет работать со ссылочным объектом. Если это только угловой, я буду использовать ваш нынешний подход. Но поскольку вы связываете модель с моделью firebase, я думаю, что это один из способов ее достижения. - person skeep; 08.09.2013