2016-03-28 4 views
1

Я начинаю с angularJs и имею, как я думаю, простую проблему с изменениями в моем $scope.Как включить автоматический просмотр angularJs?

У меня есть объект $scope.tasks который я получил от сервера. Это выглядит следующим образом:

{ 
2: {id: 2, name: 'name1', user: 3}, 
3: {id: 3, name: 'name2', user: 1}, 
4: {id: 4, name: 'name3', user: 4}, 
} 

также у меня есть функция, которая пользователя обновления в задаче:

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).success(function(data, status) { 
     $scope.tasks[taskId].user = userId; //#1 
    }); 
}; 

также у меня есть пользовательская функция $scope.test(); эта функция должна быть выполнена после каждой смены пользователя в задачах, например, после запроса обновления и обновления на // # 1

Я пытался использовать для этой цели $ часы и $ watchCollection:

$scope.$watchCollection('tasks', function() { 
    $scope.test(); 
}) 

Но это не поможет. И теперь я должен вставить $scope.test() во все места, когда я обновляю свои $ scope.tasks. Это очень грустно. Как я могу сделать это автоматически?

+1

Когда вы регистрируете часы и как вы запускаете изменения? –

+0

@DavidL Я регистрирую часы в конце своего контроллера и сработал с изменением ng в списке. – Neversmile

+0

Это твоя проблема. Зарегистрируйте его в начале. Если вы зарегистрируете его в конце, есть разумный шанс, что он не будет зарегистрирован, пока какое-либо взаимодействие, которое он будет наблюдать, уже прошло. И, наконец, это может показаться дизайнерским запахом. Вместо этого вы можете использовать подход обратного вызова. –

ответ

1

Использование часов не является хорошей практикой, чтобы иметь его в коде. Я бы сказал, что при вызове метода test, когда вы получаете update, вызов становится успешным.

И внутри success обратного вызова post вызова делают сделать еще один звонок, чтобы получить обновленную tasks список, чтобы ваши данные view правильно синхронизированы с данными сервера. В настоящее время вы обновляете данные на стороне клиента для конкретной записи, что не имеет смысла в ориентированном на данные приложении, которое широко используется несколькими пользователями. Если у вас есть 1000 пользователей, которые обращаются к этому приложению, и пока вы обновляете какую-либо запись, у других пользователей также есть updated/added любая запись на той же странице. Таким образом, это добавит непоследовательность поведения внутри приложения. Поэтому я предлагаю вам снова сделать еще один ajax для получения данных &, чтобы ваше приложение выглядело более согласованным и точным. Создание еще одного вызова ajax не принимало бы 100ms, что было бы менее дорогостоящим.

Код

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).then(function(response) { 
     var data = response.data; 
     $scope.getTasks(); 
     $scope.test(); 
    }); 
}; 

$scope.getTasks = function(){ 
    $http.get('getTasksUrl').then(function(response){ 
     $scope.tasks = response.data; 
    }); 
} 
+0

Я знаю, что использование $ watch может привести к проблемам с производительностью и какой-то плохой практике .. но почему вы говорите, что это «плохая практика»? Я не думаю, что это всегда плохая практика. –

+0

@PankajParkar Да, я согласен с вами. Я показываю код схематически и очень просто. Я обновляю свои задачи с помощью '$ scope.tasks [taskId] .user = userId;' если запрос выполняется успешно. В вашем примере я не хочу снова возвращать все задачи, если я изменяю только одного пользователя в задаче. Я думаю, что это не оправдано – Neversmile

+0

@ Gonzalo.- потому что вы знаете, что наблюдатель хорошо будет смотреть это выражение в каждом цикле дайджест. Предположим, у вас есть большой объект коллекции, у которого есть «глубокий» наблюдатель, так что это испортит и замедлит производительность вашего приложения .. поэтому старайтесь избегать использования наблюдателя при разработке приложения .. лично я рекомендую этот путь .. –

0

Вы можете написать директиву с наблюдателем и поставить на модели, которые вы хотите наблюдать. Но если вы правильно поняли, что вам нужно обновлять данные на своей странице после успешного почтового запроса, вы можете добиться этого, выполнив запрос на получение запроса, после успешной публикации или в худшем случае вы можете использовать перезагрузку маршрута или штата в зависимости от того, какой маршрутизатор вы используете ,

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