2015-07-02 3 views
0

В моем приложении у меня есть раздел, называемый «уведомлениями» внутри вида, называемый 'home.html'. Теперь мне нужно использовать этот раздел в другом представлении, поэтому я скопировал всю разметку уведомлений внутри «notifications.html», которую я использую с помощью композиции.Durandal составляет значение изменения переменной связанной модели просмотра

Проблема в том, что я не хочу копировать весь код, который я использую для уведомлений, для работы с 'home.js' в другую модель представления моего нового представления, которая будет использовать уведомления. Поэтому вместо того, чтобы иметь observableArray уведомлений внутри вида viewmodel, я хочу иметь модуль только для 'notification.html', который содержит эти данные. Но я не знаю, как я могу изменить значение observableArray внутри 'notification.js' из моих других режимов просмотра.

Вот что я сделал до сих пор:

notification.js

define(['knockout'], function(ko) { 

var notifications = ko.observableArray([]), 
setNotifications = function(data) { 
    notifications(data) 
} 

return { 
    notifications: notifications, 
    setNotifications: setNotifications 
} 

home.js

define(['knockout', 'notification'], function(ko, notification) { 
    var self = this 
    ... 
    self.activate = function() { 
    http.get('...').then(function(data) { 
    notification.setNotification(data) 
    }) 
} 

home.html

<div data-bind="compose: 'viewmodels/notifications'"></div> 

То, что я знаю, что при использовании пути viewmodel в составлять привязку, разметка этой модели просмотра вводится и привязана к ее модулю отображения модуля.

Проблема: я хочу изменить значение массива «уведомлений» внутри 'notification.js' из модели просмотра моего основного вида, 'home.js'. Я знаю, что моя текущая предварительная работа не сработает, потому что я считаю, что экземпляр модели ввода notifications.js, введенный в notifications.html, не является тем же самым экземпляром, который мне нужен внутри home.js. Итак, как я могу это достичь?

+0

Would вам нравятся уведомления для работы в качестве сингла? Итак, одни и те же данные должны отображаться везде, где отображается вид уведомлений? –

ответ

0

Я мог бы решить эту проблему, используя свойство model на привязке compose.

Markup:

<div data-bind="compose: { view: 'views/notifications', model: $root.notificationModel }"></div> 

notification.js имеет один и тот же код - он возвращает ViewModel ("возвращение Vm")

И в файле home.js:

define(['knockout', 'plugins/http', 'notification'], function(ko, http, NotificationModel) { 
var self = this 
self.notificationModel; 
... 
self.activate = function() { 
    return http.get('').then(function(data) { 
    self.notificationModel = new NotificationModel() 
    self.notificationModel.setNotifications(data) 
    }) 
} 

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