【发布时间】:2016-07-19 02:08:07
【问题描述】:
在将新项目推送到列表后,我正在尝试使用 ng-repeat 更新视图,但是 ng-repeat 仍保留旧参考。这是我的代码 (功能 () { “使用严格”;
angular.module('messages', [])
.component('messages', {
template: '<ng-outlet></ng-outlet>',
$routeConfig: [
{ path: '/', name: 'MessageList', component: 'messageList', useAsDefault: true },
{ path: '/:id', name: 'MessageDetail', component: 'messageDetail' },
]
})
.component('messageList', {
templateUrl: '/angular/spa/profile/components/messages/template/message-listing.template.html',
controllerAs: "model",
controller: ["$http", messageListController],
})
.component('messageDetail', {
templateUrl: '/angular/spa/profile/components/messages/template/message-detail.template.html',
controllerAs: "model",
bindings: { $router: '<' },
controller: ["$http", messageDetailController],
})
.component('messageBubble', {
templateUrl: '/angular/spa/profile/components/messages/template/message-bubble.template.html',
controllerAs: "model",
controller: ["$http", messageBubbleController],
bindings: {
message: '<',
user: '<'
},
});
function messageBubbleController($http) {
var model = this;
model.$onInit = function () {
model.currentUserId = $("#loggedInUserIdSignalR").val();
};
}
function messageDetailController($http) {
var model = this;
model.item = null;
model.user = null;
model.message = null;
model.loading = false;
model.chatHub = $.connection.chatHub;
model.$onInit = function () {
model.loading = true;
};
model.sendMessage = function () {
if (model.message.length > 0) {
console.log(model.messages.length);
model.chatHub.server.send(model.message, model.user.SubjectId, model.item.ItemId);
}
};
model.chatHub.client.broadcast = function (message, date, recipientId, itemId, senderId, senderNickName, senderPicture) {
$scope.$apply(function () {
model.messages.push({
ConnectionId: "",
DateSent: "/Date(1468852585430)/",
Message: message,
Sender: senderId,
});
});
console.log(model.messages.length);
console.log('New incoming message: ' + name + " ->" + message)
};
this.$routerOnActivate = function (next) {
var id = next.params.id;
fetchConversationMessages($http, id).then(function (response) {
model.loading = false;
model.uid = response.uid;
model.item = response.conversation;
model.user = response.conversation.User;
model.messages = response.conversation.messages;
});
};
function fetchConversationMessages($http, id) {
return $http.get("/profile/messages-data/" + id)
.then(function (response) {
console.log(response);
return response.data;
});
}
}
function messageListController($http) {
var model = this;
model.conversations = []
model.loading = false;
model.$onInit = function () {
model.loading = true;
fetchConversations($http).then(function (conversations) {
model.loading = false;
model.conversations = conversations.results;
console.log(model.conversations);
});
};
model.$routerOnActivate = function (next) {
console.log('messages list comp activated');
}
function fetchConversations($http) {
return $http.get("/profile/conversationsData")
.then(function (response) {
return response.data;
});
}
}
})();
在这段代码中
model.chatHub.client.broadcast = function (message,date,recipientId,itemId,senderId,senderNickName,senderPicture) {
model.messages.push({
ConnectionId: "",
DateSent: "/Date(1468852585430)/",
Message: message,
Sender: senderId,
});
console.log(model.messages.length);
console.log('New incoming message: ' + name + " ->" + message)
};
是我获取新消息并将其推送到消息列表的地方,控制台日志显示更新的列表,但是我的模板上有这个
<div class="chat-room">
<pre>{{model.messages.length}}</pre>
<message-bubble ng-repeat="msg in model.messages" message="msg" user="model.user"></message-bubble>
</div>
还有这行代码
<pre>{{model.messages.length}}</pre>
仍然显示旧列表,我在另一篇文章中读到这是由于引用而发生的,但我尝试了很多不同的方法但没有运气。
【问题讨论】:
-
更新模型后是否需要触发digest/apply?
-
我认为当我发送另一条消息时会发生这种情况,你能告诉我如何手动触发吗?我尝试了 model.apply()、$scope.apply(),它说函数未定义
标签: javascript angularjs angularjs-ng-repeat ng-repeat